Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скрыть папку


Страницы:   1 2

Stalker01 ©   (2005-04-12 14:56:00) 

Можно ли программно скрыть папку под FAT32?


mgcr   (2005-04-18 12:21:00) [1]

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.


mgcr   (2005-04-18 12:20:00) [2]

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;


ANB   (2005-04-18 11:10:00) [3]


> mgcr ©   (18.04.05 10:53) [31]
- извини за зедержку, дома инет еще не провел.


> Эта...DiskIoControl брать с http://www.schevchenko.net.ru/SRC/DeviceIoControl_60.zip
- админы доступ не дают. Выслать сможешь ? Или кусок исходника оттуда с TDiskIoControl.Create(0);


mgcr   (2005-04-18 10:53:00) [4]

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

Че еще надо ?


GrayFace   (2005-04-17 20:15:00) [5]

А что было в Vir[7]?


ANB   (2005-04-15 11:31:00) [6]


> 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]
- кто то обещал примерчик ;-)


mgcr   (2005-04-15 11:21:00) [7]

ANB ©   (15.04.05 10:40) [27]

А сабж читать уже не модно ?


ANB   (2005-04-15 10:40:00) [8]


> с другой, оставит ее папкой.
- а зачем оставлять ее папкой ? Я так понимаю, вопрос стоит в том, чтобы ее хорошо спрятать и иметь возможность снова достать (иначе проще грохнуть). У меня такая проблема стояла, когда приезжала проверка проверять наличие секретных файлов на компе, а слить их мне было некуда. Начальник и попросил зашхерить так, чтобы никто не нашел. Я снача DiskEditом это сделал, а потом прогу написал.


Германн   (2005-04-15 02:00:00) [9]

2 Stalker01 ©   (14.04.05 16:53) [20]
>Jobo, спасибо! Попробую.
>Германн, тогда можно вообще за комп не садиться, это же >геморрой!

Имхо, "садиться" - ну очень часто приводит к геморрою! Но это в форум по медицине.

А по сабжу, пробуй! Пробуй любые советы из форума, пробуй свои какие-нибудь идеи. Т.е. пробуй все, что хочешь и можешь.
Токмо, имхо, не стоит "овчинка выделки" при попытках "ограничения доступа" к файловой системе в тех ОС, которые эти ограничения не поддерживают!


mgcr   (2005-04-14 18:07:00) [10]

ANB ©   (14.04.05 17:53) [24]

Я такой примерчик составлю. Но не понимаю, каким образом он с одной стороны скроет папку, с другой, оставит ее папкой.


ANB   (2005-04-14 17:53:00) [11]


> mgcr ©   (14.04.05 17:49) [23]
- составь примерчик, который прочитает один выбранный сектор с логического диска и сможет записать его обратно. Завтречка сделаю из него пример, который прячет папку в корне. :)))


mgcr   (2005-04-14 17:49:00) [12]


> 4) При грамотном подходе - никаких проблем сделать все это
> на Delphi


С этого места подробнее.


ANB   (2005-04-14 17:43:00) [13]


> Stalker01 ©   (12.04.05 19:49) [4]

1) Найди доку по прямой работе с диском, на форуме грят, что как с файлом, но я не пробовал.
2) Я делал такие штуки в 91 году еще в DOS и на TASM (просто int 13h на C у меня не получилось по человечески вызвать), а FAT32 от нее мало отличается. Только, если ты включишь таки все атрибуты, то этот элемент станет продолжением длинного имени предыдущего. Ищи доку по логическому устройству диска. Я читал "Системное программирование для Правец 16".
3) FAT тут ни причем, тебе нужно найти корневой каталог, пройтись ручками по всей цепочке (для сего придется определить размер кластера) найти элемент каталога для скрываемой папки, а дальше у тебя простор для творчества.
4) При грамотном подходе - никаких проблем сделать все это на Delphi, только винт не угробь. :)))


Marser   (2005-04-14 16:55:00) [14]


> jobo ©   (14.04.05 1:15) [18]

Согласен с Германом.


Stalker01   (2005-04-14 16:53:00) [15]

Jobo, спасибо! Попробую.
Германн, тогда можно вообще за комп не садиться, это же геморрой!


Германн   (2005-04-14 02:04:00) [16]

2Stalker01 ©   (13.04.05 23:09) [16]
>jobo, спасибо, а что даёт этот атрибут? И как можно осуществить >поиск папки через прямой доступ к диску?

Это даёт геморрой! И никакой врач не поможет. :(


jobo   (2005-04-14 01:15:00) [17]

есть атрибут файла faVolumeID (faVolumeID = $00000008 platform;) метка диска.
но через FileSetAttr или SetFileAttributes установить этот атрибут для папки система не даст. так что придется напрямую к файловой системе: считываеш ФАТ таблицу потом находиш в ней абсолютный адрес нужной папки и записывеш атрибут VolumeID. Структуру ФАТ и т.п. смотри в справочниках по асемблеру.


Marser   (2005-04-14 00:12:00) [18]


> jobo ©   (13.04.05 18:34) [15] [Новое
>сообщение][Ответить]
>2Stalker01:
>установи для директории атрибут Volume.
> если с помощью SetFileAttributes не поллучиться тогда
> через прямой доступ к диску, поиск дира по ФАТ и т.д.
> Можно и на делфе, хоть обычно такое на АСМе пишется
> (или вставках асмовых)

Очень интересно! А можно подробнее?


> Stalker01 ©   (13.04.05 23:09) [16] [Новое
>сообщение][Ответить]
> jobo, спасибо, а что даёт этот атрибут? И как можно
> осуществить поиск папки через прямой доступ к диску?

Volume - это том. Такого параметра для файла нету.
А прямой доступ диску происходит с помощью стандартных функций API для работы с файлами.


Stalker01   (2005-04-13 23:09:00) [19]

jobo, спасибо, а что даёт этот атрибут? И как можно осуществить поиск папки через прямой доступ к диску?


jobo   (2005-04-13 18:34:00) [20]

2Stalker01:
установи для директории атрибут Volume.
если с помощью SetFileAttributes не поллучиться тогда через прямой доступ к диску, поиск дира по ФАТ и т.д. Можно и на делфе, хоть обычно такое на АСМе пишется (или вставках асмовых)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо