Список системных модулей в виде PSYSTEM_MODULE_INFORMATION

Тема в разделе "WASM.NT.KERNEL", создана пользователем IceFire, 9 май 2007.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Суть:

    Использую ZwQuerySystemInformation для получения списка загруженных модулей. Примерно так:

    Код (Text):
    1.     ns = ZwQuerySystemInformation(SystemModuleInformation, &p, 0, &cb);
    2.         if (!cb) return 0;
    3.  
    4.     p = ExAllocatePool(PagedPool, cb);
    5.         if (!p) return 0;
    6.    
    7.     ns = ZwQuerySystemInformation(SystemModuleInformation, p, cb, &cb);
    И получаю в p->Modules[0].ImageName адрес вида: "\WINDOWS\System32\ntoskrnl.exe". Теперь вопрос. А как получить ПОЛНЫЙ адрес (с буквой диска)? Предложения "тупо дописать спереди "С:"" - сразу фтопку. Мне интересно каким образом надо действовать "правильно", чтобы получить рабочий результат даже на тех машинах, где система установлена не на С:.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я юзаю такой кривой код :)
    Для NtCreateFile нормально работает.
    Код (Text):
    1. WCHAR pszSysRoot[] = L"\\WINDOWS\\";
    2. #define SYSROOT_SIZE 18
    3. WCHAR pszTmpDrvName[260] = L"\\SystemRoot\\System32\\drivers\\";
    4. #define TMPNAME_END 29
    5. WCHAR pszTmpDrvName2[260] = L"\\SystemRoot\\";
    6. #define TMPNAME2_END 12
    7.  
    8. PWSTR GetPEPath(PUNICODE_STRING pusBasePath){
    9.     PWSTR ret = pusBasePath->Buffer;
    10.  
    11.     if (ret[0] != '\\'){
    12.         memcpy(&pszTmpDrvName[TMPNAME_END], ret, pusBasePath->MaximumLength * 2);
    13.         ret = pszTmpDrvName;
    14.     } else
    15.         if (!memcmp(ret, pszSysRoot, SYSROOT_SIZE)){
    16.             memcpy(&pszTmpDrvName2[TMPNAME2_END], &ret[SYSROOT_SIZE / 2],
    17.                 pusBasePath->MaximumLength * 2 - SYSROOT_SIZE);
    18.             ret = pszTmpDrvName2;
    19.         }
    20.  
    21.     return ret;
    22. }
    Если хочешь чтобы SystemRoot преобразовалось в нормальный путь, то SharedUserData->NtSystemRoot будет тебе полезно.
     
  3. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    А если из ring3? Как сделать то же?
     
  4. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    ExpandEnvironmentStrings

    Вопрос отпал, спасибо за предыдущий ответ.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Из ринг3 можно еще резолвнуть симлинк \SystemRoot просто через NtQuerySymbolicLinkObject