Узнать букву системного диска

Тема в разделе "WASM.NT.KERNEL", создана пользователем drem1lin, 21 янв 2011.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Как узнать букву системного диска из драйвера? Windows XP SP3
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Прочитать NT-like путь к разделу из символьной ссылки \SystemRoot, после чего найти в \GLOBAL?? символьную ссылку с буквой для этого пути.
    Но возможно, есть и более адекватный способ (например, с перечислением точек монтирования через IOCTL запросы к mount manager-у or something).

    UPD: Есть функция IoQueryFileDosDeviceName() которой можно скормить файл, открытый по NT-like пути и получить букву раздела.
     
  3. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    А попроще способов нет? не хочется создавать много кода. Может в реестре где это есть?
     
  4. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    Чем тебе IoQueryFileDosDeviceName не угодил?
    1. Открываешь \SystemRoot\system32\ntdll.dll
    2. Передаёшь File Object в IoQueryFileDosDeviceName.
    Всё.
     
  5. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Могу предложить крестьянское решение.
    Получи переменную windir откинь лишнее и останется буква.

    Если, конечно, тебе можно вызывать соотв. апи.
     
  6. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    NtSystemRoot = $7FFE0030 ? :)
     
  7. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    IoQueryFileDosDeviceName() Требует на вход FILE_OBJECT, как надо файл открывать, что бы его получить? или это HANDLE?
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    ObReferenceObjectByHandle()

    Нет.
     
  9. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Попробовал следующее
    Открыть блокнот через ссылку на SystemRoot и узнать полное Дос имя файла Notepad.exe, но не удается сформировать Дос имя, где то ошибаюсь. Вечно либо BSOD или Exception
    Код (Text):
    1. void GetSystemDisk ()
    2. {
    3.     HANDLE hFile;
    4.     OBJECT_ATTRIBUTES oaFileAttr;
    5.     IO_STATUS_BLOCK iosb;
    6.     UNICODE_STRING usFileName;
    7.     NTSTATUS ntsRetStatus;
    8.     PVOID foBuffer;
    9.     OBJECT_NAME_INFORMATION** oniFileNameInfo;
    10.     UNICODE_STRING usDriveLetter = {0};
    11.     PDEVICE_OBJECT pDev;
    12.    
    13.     RtlInitUnicodeString(&usFileName,L"\\SystemRoot\\Notepad.exe");
    14.     InitializeObjectAttributes(&oaFileAttr,&usFileName,OBJ_CASE_INSENSITIVE,NULL,NULL);
    15.     ntsRetStatus = ZwOpenFile(&hFile,GENERIC_ALL,&oaFileAttr,&iosb,FILE_SHARE_READ,FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT);
    16.     DbgPrint("ZwOpenFile status code 0x%x\n",ntsRetStatus);
    17.     if (ntsRetStatus!=STATUS_SUCCESS)
    18.     {
    19.         return;
    20.     }
    21.    
    22.     ntsRetStatus = ObReferenceObjectByHandle(hFile,FILE_ALL_ACCESS,*IoFileObjectType,KernelMode,&foBuffer,NULL);
    23.     DbgPrint("ObReferenceObjectByHandle status code 0x%x\n",ntsRetStatus);
    24.     if (ntsRetStatus!=STATUS_SUCCESS)
    25.     {
    26.         ZwClose(hFile);
    27.         return;
    28.     }
    29.     __try{
    30.         if (PASSIVE_LEVEL == KeGetCurrentIrql());
    31.         {
    32.             pDev = IoGetRelatedDeviceObject((PFILE_OBJECT)foBuffer);
    33.             IFDEBUG(DbgPrint("pDev = 0x%x\n",pDev));
    34.             ntsRetStatus = IoVolumeDeviceToDosName(pDev,&usDriveLetter);
    35.             //ntsRetStatus  = IoQueryFileDosDeviceName(&foBuffer,oniFileNameInfo);
    36.             //DbgPrint("IoVolumeDeviceToDosName status code 0x%x\n",ntsRetStatus);
    37.            
    38.             if (ntsRetStatus!=STATUS_SUCCESS)
    39.             {
    40.                 ZwClose(hFile);
    41.                 return;
    42.             }
    43.             //DbgPrint("Drive Letter %S\n",usDriveLetter.Buffer);
    44.         }
    45.     }
    46.     __except(EXCEPTION_EXECUTE_HANDLER)
    47.     {
    48.         DbgPrint("Exception Handled\n");
    49.     }
    50.     ZwClose(hFile);
    51.     return;
    52. }
     
  10. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Честно говоря, хз. Выглядит правильно, за исключением отсутствия ObDereferenceObject и ExFreePool, но это не должно быть причиной. Давай сюда !analyse -v чтоле.
     
  11. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    drem1lin
    Для начала, вместо IoGetRelatedDeviceObject() попробуй тупо взять девайс из pFileObject -> DeviceObject. Если всё равно будет падать, покажи анализ дампа. Дальше видно будет.