Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ZwCreateFile - название винчестера, Native API 
:(
    Опции темы
developer2007
  Дата 30.4.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: -1
Всего: -2



Пишу программку на натив апи, надо получить доступ к винчестеру, раньше на обычном вин апи юзал CreateFile c девайсом \\.\PhysicalDrive0,
но в натив апи такого нету, там идёт наименование как-то по другому, методом тыка вычислил по верному хэндлу,
\Device\Harddisk0\Partition0 - тогда NTSTATUS в порядке, но это получается доступ к разделу,
а мне нужен к самому винчестеру. Попробовал \Device\Harddisk0 - выдаёт #STATUS_OBJECT_TYPE_MISMATCH.
Функция такая:

Код

var
   DeviceName: TUNICODE_STRING;
   ObjectAttributes:OBJECT_ATTRIBUTES;
begin
 RtlInitUnicodeString(@DeviceName, PWideChar('\Device\Harddisk0\Partition0'));
 InitializeObjectAttributes(@ObjectAttributes,@DeviceName,OBJ_CASE_INSENSITIVE,0,nil);

ZwCreateFile(@h, FILE_READ_DATA or SYNCHRONIZE, @ObjectAttributes, @Pio1, nil, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ or FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, nil, 0);

Уже всю башку об стенку избил  smile  - помогите кто чем может, люди добрые! smile 

Это сообщение отредактировал(а) developer2007 - 30.4.2009, 10:15
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Riply
Дата 30.4.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(developer2007 @  30.4.2009,  10:13 Найти цитируемый пост)
там идёт наименование как-то по другому, методом тыка вычислил по верному хэндлу


Например, можно использовать префикс \??\

Цитата(developer2007 @  30.4.2009,  10:13 Найти цитируемый пост)
Уже всю башку об стенку избил  


Так и будет продолжаться, пока будешь подбирать параметры ф-ий методом тыка,
а не поиском и изучением соответствующей литературы. 
PM MAIL   Вверх
developer2007
Дата 30.4.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: -1
Всего: -2



да я как раз сейчас на мсдн нашёл этот префикс, с ним доступ к винчестеру \??\PhysicalDrive0 получается нормальным, статус 0, но вот затем полученный хэндл на устройство я скармливаю ZwDeviceIoControlFile, которое мне выдаёт #STATUS_INVALID_HANDLE smile 

Это сообщение отредактировал(а) developer2007 - 30.4.2009, 10:48
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Riply
Дата 30.4.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(developer2007 @  30.4.2009,  10:45 Найти цитируемый пост)
да я как раз сейчас на мсдн нашёл этот префикс


Ну что ж - молодец (без смайлика)

Цитата(developer2007 @  30.4.2009,  10:45 Найти цитируемый пост)
с ним доступ к винчестеру \??\PhysicalDrive0 получается нормальным, статус 0, но вот затем полученный хэндл на устройство я скармливаю ZwDeviceIoControlFile, которое мне выдаёт #STATUS_INVALID_HANDLE  


Теперь изучай литературу дальше smile
Все дело в том, что различных объектов, котороые ты окрестил одинм словом "винчестер" как в Бразилии Педров smile
Тебе надо понимать, какой именно из них ты открыл и что от него можно требовать.
Я, например, лично дла себя (т.е. не вслух а мысленно. мне так удобней) их разбиваю на
драйвер устройства, устойство, физ. диск и логический диск.

P.S. 
 Этими четырьмя пунктами все они не исчерпываются.
 Повторюсь: названия "для себя" и искать в них глубокий смысл или отталкиваться от них не стоит,
 просто мне показалось, что они наиболее подходящие smile
PM MAIL   Вверх
developer2007
Дата 30.4.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: -1
Всего: -2



Спасибо за помощь, красавица smile 
IOCTL_STORAGE_QUERY_PROPERTY и STORAGE_PROPERTY_QUERY - вот это в ZwDeviceIoControl юзается. Что мне для этого надо открывать?
P.S. Нашёл ещё один способ доступа - \Device\Harddisk0\DR0
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
developer2007
Дата 3.5.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: -1
Всего: -2



Хм, нечто воцарилась ненормальная тишина и покой smile 
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Riply
Дата 4.5.2009, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(developer2007 @  3.5.2009,  21:09 Найти цитируемый пост)
Хм, нечто воцарилась ненормальная тишина и покой   


А что ты ожидал, если задаешь, в сущности, один и тот же вопрос, причем
и палец о палец не ударив, чтобы его хотя бы грамотно сформулировать.
Достаточно было посмотреть Help к данной команде и там черным по белому на чистейшем буржуинском smile
написано что "надо открывать". Плюс к этому дается целая куча функций типа:
FindFirstPartition, FindFirstVolume, FindFirstVolumeMountPoint, FindFirstDevice и иже с ними.
Выбирай ту, что тебе нужна и вперед. Там и примеры для них есть.

Ну да ладно. "Дело было вечером - делать было нечего" smile
Посему набросала небольшой пример.
Сразу оговариваюсь: писалось "на коленке", серьезно не тестировалось (работает и ладно, ибо ленивая я очень)
И, разумеется это не единственный путь решения данной задачи.

Код

type
 PNAMED_GUID = ^_NAMED_GUID;
 _NAMED_GUID = packed record
  _Guid: TGUID;
  NameU: UNICODE_STRING;
 end;

type
 TCheckGUID_CallBack = function(const pCheckGUID: PGUID): ULONG;
 TEnumDevDescrip_CallBack = function(const pStgDescript: PSTORAGE_DEVICE_DESCRIPTOR; const Status: NTSTATUS): NTSTATUS;

const
//_Floppy Disk Drives
 _FloppyDisk = 'FloppyDisk';
 SysClassGuid_FloppyDisk: _NAMED_GUID =
    (_Guid: '{4d36e980-e325-11ce-bfc1-08002be10318}';
     NameU: (Length: Length(_FloppyDisk) shl SHR_WCHAR; MaximumLength: Length(_FloppyDisk) shl SHR_WCHAR + SizeOf(WideChar); 
     Buffer: _FloppyDisk));
// This class includes floppy disk drives.

//_CD-ROM Drives
 _CDROM = 'CDROM'; // CDROM
 SysClassGuid_CDROM: _NAMED_GUID =
    (_Guid: '{4d36e965-e325-11ce-bfc1-08002be10318}';
     NameU: (Length: Length(_CDROM) shl SHR_WCHAR; MaximumLength: Length(_CDROM) shl SHR_WCHAR + SizeOf(WideChar); 
     Buffer: _CDROM));
// This class includes CD-ROM drives, including SCSI CD-ROM drives. By default, the system's CD-ROM class installer also installs a system-supplied CD audio driver and CD-ROM changer driver as Plug and Play filters.

//_Disk Drives
 _DiskDrive = 'DiskDrive'; // DiskDrive
 SysClassGuid_DiskDrive: _NAMED_GUID =
    (_Guid: '{4d36e967-e325-11ce-bfc1-08002be10318}';
     NameU: (Length: Length(_DiskDrive) shl SHR_WCHAR; MaximumLength: Length(_DiskDrive) shl SHR_WCHAR + SizeOf(WideChar); 
     Buffer: _DiskDrive));
// This class includes hard disk drives. See also the HDC and SCSIAdapter classes.

const
 DeviceClassFS: array[0..2] of PNAMED_GUID = (@SysClassGuid_CDROM, @SysClassGuid_DiskDrive, @SysClassGuid_FloppyDisk);

 DEVICE_DESCRIPTOR_INC = 512 - SizeOf(STORAGE_DEVICE_DESCRIPTOR);

function StorageQueryPropertyEx(const ObjHandle: THANDLE; const pPropQuery: PSTORAGE_PROPERTY_QUERY;
           const BytesPerQuery: ULONG; var pStgDevDescript: PVOID; var BytesPerStgDevDescript: ULONG): NTSTATUS;
var
 BytesReturn: ULONG;
begin
 if BytesPerStgDevDescript < SizeOf(STORAGE_DESCRIPTOR_HEADER) then
  begin
   BytesPerStgDevDescript := SizeOf(STORAGE_DESCRIPTOR_HEADER);// +  DEVICE_DESCRIPTOR_INC;
   ReallocMem(pStgDevDescript, BytesPerStgDevDescript);
  end;
 Result := Zw_DeviceIoControlFile(ObjHandle, IOCTL_STORAGE_QUERY_PROPERTY, pPropQuery,
                                  BytesPerQuery, pStgDevDescript, BytesPerStgDevDescript, @BytesReturn);
 if NT_SUCCESS(Result) and (BytesReturn >= SizeOf(STORAGE_DESCRIPTOR_HEADER)) then
  with PSTORAGE_DESCRIPTOR_HEADER(pStgDevDescript)^ do
   if Size >= BytesReturn then
    begin
     BytesPerStgDevDescript := ROUND_UP64(Size);
     ReallocMem(pStgDevDescript, BytesPerStgDevDescript);
     Result := Zw_DeviceIoControlFile(ObjHandle, IOCTL_STORAGE_QUERY_PROPERTY, pPropQuery,
                                  BytesPerQuery, pStgDevDescript, BytesPerStgDevDescript, @BytesReturn);
    end;
end;

function StorageQueryProperty(const ObjHandle: THANDLE; var pStgDevDescript: PVOID; var BytesPerStgDevDescript: ULONG): NTSTATUS;
var
 PropQuery: STORAGE_PROPERTY_QUERY;
begin
 RtlZero(@PropQuery, SizeOf(STORAGE_PROPERTY_QUERY));
 PropQuery.PropertyId := StorageDeviceProperty;
 PropQuery.QueryType := PropertyStandardQuery;
 Result := StorageQueryPropertyEx(ObjHandle, @PropQuery, SizeOf(STORAGE_PROPERTY_QUERY), pStgDevDescript, BytesPerStgDevDescript);
end;

function StorageQueryPropertyByDevName(const pDevName: PUNICODE_STRING; var pStgDevDescript: PVOID; var BytesPerStgDevDescript: ULONG): NTSTATUS;
var
 ObjAttr: OBJECT_ATTRIBUTES;
 IoBlock: IO_STATUS_BLOCK;
 hObject: THANDLE;
begin
 InitializeObjectAttributesKrnlObj(@ObjAttr, pDevName, OBJ_CASE_INSENSITIVE, nil, nil);
 Result := ZwOpenFile(@hObject, READ_CONTROL, @ObjAttr, @IoBlock, FILE_SHARE_SH_ALL, FILE_NON_DIRECTORY_FILE);
 if NT_SUCCESS(Result) then
  try
   Result := StorageQueryProperty(hObject, pStgDevDescript, BytesPerStgDevDescript);
  finally
   ZwClose(hObject);
  end;
end;

function SetupDiGetDeviceRegistryPropertyMemW(const DeviceInfoSet: HDEVINFO; const DeviceInfoData: TSPDevInfoData; const PropertyCode: ULONG;
                                              var PropertyRegDataType: ULONG; var pBuffer: PVOID; var cbBufferSize, RequiredSize: ULONG): ULONG;
begin
 RequiredSize := 0;
 if not SetupDiGetDeviceRegistryPropertyW(DeviceInfoSet, DeviceInfoData, PropertyCode, PropertyRegDataType, 
                                                                     pBuffer, cbBufferSize, RequiredSize) then
  begin
   Result := GetLastError;
   case Result of
    ERROR_INSUFFICIENT_BUFFER:
     begin
      Assert(RequiredSize > cbBufferSize, 'RequiredSize > cbBufferSize');
      cbBufferSize := RequiredSize;
      ReallocMem(pBuffer, cbBufferSize);
      if SetupDiGetDeviceRegistryPropertyW(DeviceInfoSet, DeviceInfoData, PropertyCode, 
                                                                    PropertyRegDataType, pBuffer, cbBufferSize, RequiredSize)
       then Result := ERROR_SUCCESS
       else Result := GetLastError;
     end;
   end;
  end
 else Result := ERROR_SUCCESS;
end;

function EnumDevicesDescriptors(const hSysDevices: HDEVINFO; const CheckGUID: TCheckGUID_CallBack;
                                const EnumDevDescrip_CallBack: TEnumDevDescrip_CallBack): ULONG;
const
 AVERAGE_DEVICE_INFO_SIZE = 512;
var
 Index, cbDataType: DWORD;
 DeviceInfoData: SP_DEVINFO_DATA;
 pBuffer, pStgDevDescript: PVOID;
 BytesPerBuffer, BytesRequired, BytesPerStgDevDescript: ULONG;
 Us: UNICODE_STRING;
 RetStatus: NTSTATUS;
begin
 Result := ERROR_SERVICE_NOT_FOUND;
 BytesPerBuffer := AVERAGE_DEVICE_INFO_SIZE;
 pBuffer := GetMemory(BytesPerBuffer);
 if pBuffer <> nil then
  try
   Index := 0;
   BytesPerStgDevDescript := 0;
   pStgDevDescript := nil;
   RtlZero(@DeviceInfoData, SizeOf(SP_DEVINFO_DATA));
   DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);
   while SetupDiEnumDeviceInfo(hSysDevices, Index, DeviceInfoData) do
    begin
     if CheckGUID(@DeviceInfoData.ClassGuid) <> FILE_DEVICE_ERROR then
      begin
       Result := SetupDiGetDeviceRegistryPropertyMemW(hSysDevices, DeviceInfoData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
                                                     cbDataType, pBuffer, BytesPerBuffer, BytesRequired);
       if Result = ERROR_SUCCESS then
        begin
         Us_InitLen_(@Us, pBuffer, BytesRequired);
         Us_TrimRight(@Us);
         RetStatus := StorageQueryPropertyByDevName(@Us, pStgDevDescript, BytesPerStgDevDescript);
         if not NT_SUCCESS(EnumDevDescrip_CallBack(pStgDevDescript, RetStatus)) then Break;
        end
      end;
    Inc(Index);
    end;
  finally
   ReallocMem(pStgDevDescript, 0);
   ReallocMem(pBuffer, 0);
  end
 else Result := ERROR_NO_SYSTEM_RESOURCES;
end;

function EnumDevDescriptorsByClass(const Flag: ULONG; const CheckGUID: TCheckGUID_CallBack;
                                   const EnumDevDescrip_CallBack: TEnumDevDescrip_CallBack): ULONG;
var
 hSysDevices: HDEVINFO;
begin
 hSysDevices := SetupDiGetClassDevsExW(nil, nil, 0, Flag, nil, nil, nil);
 if hSysDevices <> PINVALID_HANDLE_VALUE then
  try
   Result := EnumDevicesDescriptors(hSysDevices, CheckGUID, EnumDevDescrip_CallBack);
  finally
   SetupDiDestroyDeviceInfoList(hSysDevices);
  end
 else Result := GetLastError;
end;

function Int128_IsEqual(const pFirst, pSecond: PVOID): BOOLEAN; inline;
begin
 Result := (PInt64(pFirst)^ = PInt64(pSecond)^)
   and (PInt64(IncPtr(pFirst, SizeOf(Int64)))^ = PInt64(IncPtr(pSecond, SizeOf(Int64)))^);
end;

function IsGUID_FS(const pCheckGUID: PGUID): ULONG;
var
 i: integer;
begin
 for i := Low(DeviceClassFS) to High(DeviceClassFS) do
  if Int128_IsEqual(@DeviceClassFS[i]._Guid, pCheckGUID) then
   begin
    if i = 0 then Result := FILE_DEVICE_CD_ROM else
     if i = 1 then Result := FILE_DEVICE_DISK else
      if i = 2 then Result := FILE_DEVICE_FLOPPY else Result := FILE_DEVICE_ERROR;
    Exit;
   end;
 Result := FILE_DEVICE_ERROR;
end;

function EnumDevDescrip_CallBack(const pStgDescript: PSTORAGE_DEVICE_DESCRIPTOR; const Status: NTSTATUS): NTSTATUS;
begin
 Result := STATUS_SUCCESS;
 if NT_SUCCESS(Status) then
  with pStgDescript^ do
   if ProductIdOffset > 0
    then MessBox_Inf(PAnsiChar(IncPtr(pStgDescript, ProductIdOffset)))
    else
 else MessBox_Inf(SysErrorMessage(RtlNtStatusToDosError(Status)));
end;

function CallEnumDevDescrip(): ULONG;
begin
 Result := EnumDevDescriptorsByClass(DIGCF_ALLCLASSES or DIGCF_DEVICEINTERFACE or DIGCF_PRESENT,
                                     IsGUID_FS, EnumDevDescrip_CallBack);
end;


P.S.
 В примере используется несколько простейших собственнолапных ф-ий (например IncPtr).
 Распишешь их сам (по смыслу понятно что они делают)

Это сообщение отредактировал(а) Riply - 4.5.2009, 06:31
PM MAIL   Вверх
Riply
Дата 4.5.2009, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Riply @  4.5.2009,  06:28 Найти цитируемый пост)
Распишешь их сам (по смыслу понятно что они делают)


Sorry.
Проглядела. Затесалась одна не совсем очевидная ф-ия:

Код

function Zw_DeviceIoControlFile(const ObjHandle: THANDLE; const IoControlCode: ULONG; const pInBuffer: PVOID; 
        const InBufferLength: ULONG; const pOutBuffer: PVOID; const OutBufferLength: ULONG; 
        const pBytesReturned: PULONG{$IFNDEF SH_KRNL_DRV} = nil{$ENDIF}): NTSTATUS;{$IFDEF SH_KRNL_DRV}stdcall;{$ENDIF}
var
 IoBlock: IO_STATUS_BLOCK;
begin
 Result := ZwDeviceIoControlFile(ObjHandle, 0, nil, nil, @IoBlock, IoControlCode, pInBuffer, InBufferLength, pOutBuffer, OutBufferLength);
 if Result = STATUS_PENDING then
  begin
   Result := ZwWaitForSingleObject(ObjHandle, False, nil);
   if NT_SUCCESS(Result) then Result := IoBlock.Status;
  end;
 if pBytesReturned <> nil then pBytesReturned^ := IoBlock.Information;
end;

PM MAIL   Вверх
developer2007
Дата 7.5.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: -1
Всего: -2



Спасибо за код, ты солнышко, но я решил по-своему, подсмотрел у тебя только ZwOpenFile. Но всё равно ты девушка моей мечты smile Ещё раз спс!
--------------------
У настоящего програмёра прога пишется на асме с использованием натив апи 
PM MAIL   Вверх
Riply
Дата 7.5.2009, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(developer2007 @  7.5.2009,  18:40 Найти цитируемый пост)
но я решил по-своему


Вообще-то кузяво делится найденым решением, 
ибо на форуме могут быть люди, которым это тоже интересно smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.