Форум: "WinAPI";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизСкрыть папку Найти похожие ветки
← →
Stalker01 © (2005-04-12 14:56) [0]Можно ли программно скрыть папку под FAT32?
← →
Плохиш © (2005-04-12 14:58) [1]Установить свойство "hidden"
← →
ANB © (2005-04-12 15:15) [2]Если сможешь найти на диске место, где хранится дирректория, то при замене первой буквы ДОС имени папки на русскую "х", папка будет считаться удаленной. Обратная замена ее покажет. Только ScanDisk будет ругаться на потерянные цепочки.
← →
Marser © (2005-04-12 16:47) [3]SetFileAttributes
← →
Stalker01 © (2005-04-12 19:49) [4]Поменять свойство не подойдет, т.к. папка должна быть невидимая даже если включенно отображение скрытых файлов.
ANB, а как можно найти это место на диске? Есть какие-нибудь API функции?
← →
VMcL © (2005-04-12 21:43) [5]>>Stalker01 © (12.04.05 19:49) [4]
Тогда только при помощи драйвера.
← →
Stalker01 © (2005-04-12 22:47) [6]А драйвер реально реализовать на Делфи? Не подскажите где можно найти документацию по его написанию?
← →
Vir (2005-04-12 22:48) [7]Удалено модератором
← →
Stalker01 © (2005-04-12 22:52) [8]Vir, спасибо! Попробую!
← →
mgcr © (2005-04-12 23:25) [9]"Тайное всегда становится явным" (с)
Автору - не париться, а заняться полезным делом, например, закончить архитектурный институт или изобрести самодвижущееся пресс-папье.
← →
Stalker01 © (2005-04-13 01:58) [10]mgcr, я не парюсь а занимаюсь делом, пишу полезную прогу. Это не вирь и не троян, и вообще к хаку она не имеет никакого отношения!
← →
Германн © (2005-04-13 02:25) [11]2 Stalker01 © (13.04.05 01:58) [10]
И все-таки "не парься".
Это вопрос взаимоотношения ОС и пользователей.
Ставь ОС, которая позволяет разграничить права пользователей. И скрывай от некоторых, то, что им не дОлжно быть доступно.
← →
mgcr © (2005-04-13 10:36) [12]
> я не парюсь а занимаюсь делом, пишу полезную прогу
У нас разные понятия о пользе. Но советую учесть, что DDK стоит денег. И на Delphi такая задача в общем виде не реализуема.
В общем - не парься.
← →
Stalker01 © (2005-04-13 12:26) [13]Германн, mqcr, спасибо конечно за советы, но я задавал конкретный вопрос по делфи, а не о том стоит или не стоит писать программу.
← →
mgcr © (2005-04-13 12:39) [14]Stalker01 © (13.04.05 12:26) [13]
Тогда на конкретный вопрос по Delphi будет конкретный ответ - нельзя.
← →
jobo © (2005-04-13 18:34) [15]2Stalker01:
установи для директории атрибут Volume.
если с помощью SetFileAttributes не поллучиться тогда через прямой доступ к диску, поиск дира по ФАТ и т.д. Можно и на делфе, хоть обычно такое на АСМе пишется (или вставках асмовых)
← →
Stalker01 © (2005-04-13 23:09) [16]jobo, спасибо, а что даёт этот атрибут? И как можно осуществить поиск папки через прямой доступ к диску?
← →
Marser © (2005-04-14 00:12) [17]
> jobo © (13.04.05 18:34) [15] [Новое
>сообщение][Ответить]
>2Stalker01:
>установи для директории атрибут Volume.
> если с помощью SetFileAttributes не поллучиться тогда
> через прямой доступ к диску, поиск дира по ФАТ и т.д.
> Можно и на делфе, хоть обычно такое на АСМе пишется
> (или вставках асмовых)
Очень интересно! А можно подробнее?
> Stalker01 © (13.04.05 23:09) [16] [Новое
>сообщение][Ответить]
> jobo, спасибо, а что даёт этот атрибут? И как можно
> осуществить поиск папки через прямой доступ к диску?
Volume - это том. Такого параметра для файла нету.
А прямой доступ диску происходит с помощью стандартных функций API для работы с файлами.
← →
jobo © (2005-04-14 01:15) [18]есть атрибут файла faVolumeID (faVolumeID = $00000008 platform;) метка диска.
но через FileSetAttr или SetFileAttributes установить этот атрибут для папки система не даст. так что придется напрямую к файловой системе: считываеш ФАТ таблицу потом находиш в ней абсолютный адрес нужной папки и записывеш атрибут VolumeID. Структуру ФАТ и т.п. смотри в справочниках по асемблеру.
← →
Германн © (2005-04-14 02:04) [19]2Stalker01 © (13.04.05 23:09) [16]
>jobo, спасибо, а что даёт этот атрибут? И как можно осуществить >поиск папки через прямой доступ к диску?
Это даёт геморрой! И никакой врач не поможет. :(
← →
Stalker01 © (2005-04-14 16:53) [20]Jobo, спасибо! Попробую.
Германн, тогда можно вообще за комп не садиться, это же геморрой!
← →
Marser © (2005-04-14 16:55) [21]
> jobo © (14.04.05 1:15) [18]
Согласен с Германом.
← →
ANB © (2005-04-14 17:43) [22]
> Stalker01 © (12.04.05 19:49) [4]
1) Найди доку по прямой работе с диском, на форуме грят, что как с файлом, но я не пробовал.
2) Я делал такие штуки в 91 году еще в DOS и на TASM (просто int 13h на C у меня не получилось по человечески вызвать), а FAT32 от нее мало отличается. Только, если ты включишь таки все атрибуты, то этот элемент станет продолжением длинного имени предыдущего. Ищи доку по логическому устройству диска. Я читал "Системное программирование для Правец 16".
3) FAT тут ни причем, тебе нужно найти корневой каталог, пройтись ручками по всей цепочке (для сего придется определить размер кластера) найти элемент каталога для скрываемой папки, а дальше у тебя простор для творчества.
4) При грамотном подходе - никаких проблем сделать все это на Delphi, только винт не угробь. :)))
← →
mgcr © (2005-04-14 17:49) [23]
> 4) При грамотном подходе - никаких проблем сделать все это
> на Delphi
С этого места подробнее.
← →
ANB © (2005-04-14 17:53) [24]
> mgcr © (14.04.05 17:49) [23]
- составь примерчик, который прочитает один выбранный сектор с логического диска и сможет записать его обратно. Завтречка сделаю из него пример, который прячет папку в корне. :)))
← →
mgcr © (2005-04-14 18:07) [25]ANB © (14.04.05 17:53) [24]
Я такой примерчик составлю. Но не понимаю, каким образом он с одной стороны скроет папку, с другой, оставит ее папкой.
← →
Германн © (2005-04-15 02:00) [26]2 Stalker01 © (14.04.05 16:53) [20]
>Jobo, спасибо! Попробую.
>Германн, тогда можно вообще за комп не садиться, это же >геморрой!
Имхо, "садиться" - ну очень часто приводит к геморрою! Но это в форум по медицине.
А по сабжу, пробуй! Пробуй любые советы из форума, пробуй свои какие-нибудь идеи. Т.е. пробуй все, что хочешь и можешь.
Токмо, имхо, не стоит "овчинка выделки" при попытках "ограничения доступа" к файловой системе в тех ОС, которые эти ограничения не поддерживают!
← →
ANB © (2005-04-15 10:40) [27]
> с другой, оставит ее папкой.
- а зачем оставлять ее папкой ? Я так понимаю, вопрос стоит в том, чтобы ее хорошо спрятать и иметь возможность снова достать (иначе проще грохнуть). У меня такая проблема стояла, когда приезжала проверка проверять наличие секретных файлов на компе, а слить их мне было некуда. Начальник и попросил зашхерить так, чтобы никто не нашел. Я снача DiskEditом это сделал, а потом прогу написал.
← →
mgcr © (2005-04-15 11:21) [28]ANB © (15.04.05 10:40) [27]
А сабж читать уже не модно ?
← →
ANB © (2005-04-15 11:31) [29]
> Stalker01 © (12.04.05 14:56)
> Можно ли программно скрыть папку под FAT32?
- это сабж.
Ответ - можно. Как - это уже вопрос №2. Установка флагов проблему не решает, так как даже NC это все видит. Вывод - нужно ломать систему. FAT32 ломается, NTFS - не пробовал.
Мной предложен один из способов поломки. Еще идею предложил
> jobo © (14.04.05 01:15) [18]
, но этот способ прокатит в FAT16, в FAT32 будет побочный эффект, то есть имя папки присоединится к предыдущему.
> mgcr © (15.04.05 11:21) [28]
- кто то обещал примерчик ;-)
← →
GrayFace © (2005-04-17 20:15) [30]А что было в Vir[7]?
← →
mgcr © (2005-04-18 10:53) [31]ANB © (15.04.05 11:31) [29]
> - кто то обещал примерчик ;-)
procedure TfMain.FormCreate(Sender: TObject);
var
ReadBytes: Cardinal;
begin
FDisk := TDiskIoControl.Create(0);
ReadFile(FDisk.Handle, FSectorBuffer, SizeOf(FSectorBuffer), ReadBytes, nil);
if ReadBytes <> SizeOf(FSectorBuffer) then
RaiseLastOSError;
end;
Писать, соответственно, WriteFile...
Эта...DiskIoControl брать с http://www.schevchenko.net.ru/SRC/DeviceIoControl_60.zip
Че еще надо ?
← →
ANB © (2005-04-18 11:10) [32]
> mgcr © (18.04.05 10:53) [31]
- извини за зедержку, дома инет еще не провел.
> Эта...DiskIoControl брать с http://www.schevchenko.net.ru/SRC/DeviceIoControl_60.zip
- админы доступ не дают. Выслать сможешь ? Или кусок исходника оттуда с TDiskIoControl.Create(0);
← →
mgcr © (2005-04-18 12:20) [33]ANB © (18.04.05 11:10) [32]
{
Модуль: DiskIoControl
Описание: Класс для работы с физическим диском с использованием функции
DeviceIoControl.
В настоящей реализации сделаны методы получения геометрии диска
и информации о разделах диска.
Автор: Игорь Шевченко
Дата создания: 13.03.2003
История изменений:
}
unit DiskIoControl;
{$IFDEF VER140}
{$WARN SYMBOL_DEPRECATED OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$ENDIF}
interface
uses
Windows;
type
{ Геометрия диска }
PDISK_GEOMETRY = ^DISK_GEOMETRY;
DISK_GEOMETRY = packed record
Cylinders: LARGE_INTEGER;
MediaType: Integer; { MEDIA_TYPE }
TracksPerCylinder: DWORD;
SectorsPerTrack: DWORD;
BytesPerSector: DWORD;
end;
{ Значения для поля Media type }
const
UnknownMedia = 0;
F5_1Pt2_512 = 1;
F3_1Pt44_512 = 2;
F3_2Pt88_512 = 3;
F3_20Pt8_512 = 4;
F3_720_512 = 5;
F5_360_512 = 6;
F5_320_512 = 7;
F5_320_1024 = 8;
F5_180_512 = 9;
F5_160_512 = 10;
RemovableMedia = 11;
FixedMedia = 12;
F3_120M_512 = 13;
F3_640_512 = 14;
F5_640_512 = 15;
F5_720_512 = 16;
F3_1Pt2_512 = 17;
F3_1Pt23_1024 = 18;
F5_1Pt23_1024 = 19;
F3_128Mb_512 = 20;
F3_230Mb_512 = 21;
F8_256_128 = 22;
F3_200Mb_512 = 23;
type
{ Описание раздела диска }
PPARTITION_INFORMATION = ^PARTITION_INFORMATION;
PARTITION_INFORMATION = packed record
StartingOffset: int64;
PartitionLength: int64;
HiddenSectors: DWORD;
PartitionNumber: DWORD;
PartitionType: Byte;
BootIndicator: BOOLEAN;
RecognizedPartition: BOOLEAN;
RewritePartition: BOOLEAN;
Filler: DWORD;
end;
PARTITION_INFORMATION_ARRAY = array[0..1024] of PARTITION_INFORMATION;
{ Описание разделов диска }
PDRIVE_LAYOUT_INFORMATION = ^DRIVE_LAYOUT_INFORMATION;
DRIVE_LAYOUT_INFORMATION = packed record
PartitionCount: DWORD;
Signature: DWORD;
PartitionEntry: PARTITION_INFORMATION_ARRAY;
end;
{ Типы разделов }
const
PARTITION_ENTRY_UNUSED = 0; // Entry unused
PARTITION_FAT_12 = 1; // 12-bit FAT entries
PARTITION_XENIX_1 = 2; // Xenix
PARTITION_XENIX_2 = 3; // Xenix
PARTITION_FAT_16 = 4; // 16-bit FAT entries
PARTITION_EXTENDED = 5; // Extended partition entry
PARTITION_HUGE = 6; // Huge partition MS-DOS V4
PARTITION_IFS = 7; // IFS Partition
PARTITION_OS2BOOTMGR = 8; // OS/2 Boot Manager/OPUS/Coherent swap
PARTITION_FAT32 = $0B; // FAT32
PARTITION_FAT32_XINT13 = $0C; // FAT32 using extended int13 services
PARTITION_XINT13 = $0E; // Win95 partition using extended int13 services
PARTITION_XINT13_EXTENDED = $0F; // Same as type 5 but uses extended int13 services
PARTITION_PREP = $41; // PowerPC Reference Platform (PReP) Boot Partition
PARTITION_LDM = $42; // Logical Disk Manager partition
PARTITION_UNIX = $63; // Unix
PARTITION_LINUX_SWAP = $82; // Linux swap
PARTITION_LINUX_EXT2 = $83; // Linux ext2
VALID_NTFT = $C0; // NTFT uses high order bits
type
TDiskIoControl = class
private
FDriveNo: Integer;
FHandle: THandle;
FLayout: Pointer;
FLayoutSize: Integer;
FOpenForWriting: Boolean;
procedure SetDriveNo(Value: Integer);
procedure CloseDrive;
procedure OpenDrive;
function GetGeometry: DISK_GEOMETRY;
function GetLayout: PDRIVE_LAYOUT_INFORMATION;
public
constructor Create (ADriveNo: Integer);
constructor CreateWrite (ADriveNo: Integer);
destructor Destroy; override;
property Handle: THandle read FHandle;
property DriveNo: Integer read FDriveNo write SetDriveNo;
property Geometry: DISK_GEOMETRY read GetGeometry;
property Layout: PDRIVE_LAYOUT_INFORMATION read GetLayout;
end;
function MediaTypeToString (Value: Integer): string;
function PartitionTypeToString (Value: Integer): string;
implementation
uses
SysUtils;
{ Коды DeviceIoControl }
const
METHOD_BUFFERED = 0;
METHOD_IN_DIRECT = 1;
METHOD_OUT_DIRECT = 2;
METHOD_NEITHER = 3;
FILE_ANY_ACCESS = 0;
FILE_SPECIAL_ACCESS = 0;
FILE_READ_ACCESS = 1;
FILE_WRITE_ACCESS = 2;
FILE_DEVICE_DISK = 7;
IOCTL_DISK_GET_DRIVE_GEOMETRY = (FILE_DEVICE_DISK shl 16) or
(FILE_ANY_ACCESS shl 14) or (0 shl 2) or METHOD_BUFFERED;
IOCTL_DISK_GET_DRIVE_LAYOUT = (FILE_DEVICE_DISK shl 16) or
(FILE_READ_ACCESS shl 14) or (3 shl 2) or METHOD_BUFFERED;
{ TDiskIoControl }
procedure TDiskIoControl.CloseDrive;
begin
if FHandle <> INVALID_HANDLE_VALUE then begin
CloseHandle (FHandle);
FHandle := INVALID_HANDLE_VALUE;
end;
end;
constructor TDiskIoControl.Create(ADriveNo: Integer);
begin
inherited Create;
FHandle := INVALID_HANDLE_VALUE;
FDriveNo := -1;
DriveNo := ADriveNo;
end;
constructor TDiskIoControl.CreateWrite(ADriveNo: Integer);
begin
inherited Create;
FHandle := INVALID_HANDLE_VALUE;
FDriveNo := -1;
FOpenForWriting := true;
DriveNo := ADriveNo;
end;
destructor TDiskIoControl.Destroy;
begin
CloseDrive;
if Assigned(FLayout) then
FreeMem(FLayout);
inherited;
end;
function TDiskIoControl.GetGeometry: DISK_GEOMETRY;
var
Returned : DWORD;
begin
if not DeviceIoControl (FHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0,
@Result, SizeOf(Result), Returned, nil) then
RaiseLastWin32Error;
end;
function TDiskIoControl.GetLayout: PDRIVE_LAYOUT_INFORMATION;
var
Returned: DWORD;
LastError: DWORD;
begin
if not Assigned(FLayout) then begin
FLayoutSize := 1024;
GetMem(FLayout, FLayoutSize);
end;
while not DeviceIoControl (FHandle, IOCTL_DISK_GET_DRIVE_LAYOUT, nil, 0,
FLayout, FLayoutSize, Returned, nil) do begin
LastError := GetLastError;
case LastError of
ERROR_SUCCESS:
Break;
ERROR_MORE_DATA:
begin
FreeMem(FLayout);
FLayoutSize := Integer(Returned);
GetMem(FLayout, FLayoutSize);
end;
ERROR_INSUFFICIENT_BUFFER:
begin
FreeMem(FLayout);
FLayoutSize := FLayoutSize * 2;
GetMem(FLayout, FLayoutSize);
end;
else
RaiseLastWin32Error;
end;
end;
Result := PDRIVE_LAYOUT_INFORMATION(FLayout);
end;
procedure TDiskIoControl.OpenDrive;
var
FileName: String;
FileMode: Cardinal;
begin
FileName := "\\.\PhysicalDrive"+IntToStr(FDriveNo);
if FOpenForWriting then
FileMode := GENERIC_WRITE
else
FileMode := GENERIC_READ;
FHandle := CreateFile(PChar(FileName), FileMode,
FILE_SHARE_WRITE or FILE_SHARE_READ, nil,
OPEN_EXISTING, 0, 0);
if FHandle = INVALID_HANDLE_VALUE then
RaiseLastWin32Error;
end;
procedure TDiskIoControl.SetDriveNo(Value: Integer);
begin
if FDriveNo <> Value then begin
CloseDrive;
FDriveNo := Value;
OpenDrive;
end;
end;
← →
mgcr © (2005-04-18 12:21) [34]function MediaTypeToString (Value : Integer) : String;
begin
case Value of
RemovableMedia:
Result := "Removable";
FixedMedia:
Result := "Fixed";
UnknownMedia:
Result := "Unknown";
else
Result := Format("%d", [Value]);
end;
end;
function PartitionTypeToString (Value : Integer) : String;
begin
case Value of
PARTITION_ENTRY_UNUSED:
Result := "Unused";
PARTITION_FAT_12:
Result := "FAT12";
PARTITION_FAT_16, PARTITION_XINT13:
Result := "FAT16";
PARTITION_EXTENDED, PARTITION_XINT13_EXTENDED:
Result := "Extended";
PARTITION_HUGE:
Result := "Huge";
PARTITION_IFS:
Result := "NTFS";
PARTITION_FAT32, PARTITION_FAT32_XINT13:
Result := "FAT32";
PARTITION_LDM:
Result := "Dynamic";
PARTITION_UNIX:
Result := "Unix";
PARTITION_LINUX_SWAP:
Result := "Linux Swap";
PARTITION_LINUX_EXT2:
Result := "Linux Ext2";
else
Result := Format("%d", [Value]);
end;
end;
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.015 c