Здравствуйте! Столкнулся с проблемой, никак не могу решить, эта функция вроде как не работает, не могли бы вы оценить, что тут не так? Код (Text): PCWSTR GetSystemRootAddress() { UNICODE_STRING uniName; UNICODE_STRING fullName; OBJECT_ATTRIBUTES objAttr; HANDLE sysDirHandle; ULONG length; RtlInitUnicodeString(&uniName, L"\\SystemRoot"); RtlInitEmptyUnicodeString(&fullName, NULL, 0); InitializeObjectAttributes(&objAttr, &uniName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); ZwOpenSymbolicLinkObject( &sysDirHandle, GENERIC_READ, &objAttr ); ZwQuerySymbolicLinkObject( sysDirHandle, &fullName, &length); return fullName.Buffer; } Спасибо! Ps проверку статусов удалил для темы, чтобы не мешало
Первое, что бросается в глаза -- выделение структуры в стеке и возврат ее члена. При выходе из ф-ии члены структуры перетираются другими значениями (не сразу, но вскоре). Надо передавать указатель на структуру, а ф-ия будет ее заполнять. Что-то вроде: NTSTATUS GetSystemRootAddress(PUNICODE_STRING pusFullName) { ... return status; }
А вот за такое не грех и забанить. Кто знать-то должен, работает или нет? А если работает, мы тут что, должны искать ошибку, которой нет? Такие вопросы или в .BEGINNERS или в .LANG.C надо, ибо язык подучить следует в первую очередь. Ну хоть исходник выложить не забыл, и то ладно, иначе был бы тебе бан неминуемый и беспощадный. Следующий раз чтоб был дамп или что-нибудь более конкретное, чем "вроде не работает". По теме: в документации к функции ZwQuerySymbolicLinkObject() написано русским языком:
Функции, которые возвращают юникод, но не имею непосредственно размера буфера получают его из UNICODE_STRING.MaximumLength и возвращают строку в UNICODE_STRING.Buffer; иначе если размер задаётся, то обычно в буфере формируется UNICODE_STRING. Действительно, откуда сервису знать какого размера буфер. Да и вообще сервисы статус вертают, по которому обычно однозначно можно понять что вы криво делаете.
а я бы из реестра прочитал HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRoot