Задача следующая: В ветке current_user хранится информация, которая необходима драйверу в момент между логином пользователя и до того как загрузится управляющее приложение. Как из драйвера определить момент, когда можно лезть в current_user ?
Вообще нужно получить SID текущего пользователя и лезть в HKEY_USERS где в разделе с именем SID будет собственно ветка текущего пользователя аля HKEY_CURRENT_USER
Вот тебе пример (только я его почти не тестил, и у него есть минус - он определяет юзера по explorer.exe, которых может быть несколько): Код (Text): VOID GetCurrentUserName() { NTSTATUS ntStatus; HANDLE hToken = NULL;; PVOID pToken = NULL; PWCHAR pUserName = NULL; ULONG requiredLength = 0, PID = 0; PEPROCESS pProcess = NULL; PTOKEN_USER pUserInfo = NULL; UNICODE_STRING sidString; CHAR sidStringBuffer[512]; wchar_t szRegPath[512], szValue[256]; if ((PID = GetProcessIdByName(L"explorer.exe")) == 0) return; #if DBG dprintf("PID is %d", PID); #endif if (!NT_SUCCESS(PsLookupProcessByProcessId((void*)PID, &pProcess))) return; if ((pToken = PsReferencePrimaryToken(pProcess)) == NULL) return; pUserName = (PWCHAR)ExAllocatePool(NonPagedPool, FILE_NAME_LENGTH); if(!pUserName) return; ntStatus = ObOpenObjectByPointer(pToken, 0, NULL, TOKEN_QUERY, NULL, KernelMode, &hToken); ObDereferenceObject(pToken); if(!NT_SUCCESS(ntStatus)) { ExFreePool(pUserName); return; } pUserInfo = (PTOKEN_USER)ExAllocatePool(NonPagedPool, FILE_NAME_LENGTH); if(!pUserInfo) { ExFreePool(pUserName); return; } ntStatus = NtQueryInformationToken(hToken, TokenUser, pUserInfo, FILE_NAME_LENGTH, &requiredLength); if(ntStatus == STATUS_BUFFER_TOO_SMALL) { ExFreePool(pUserInfo); pUserInfo = (PTOKEN_USER)ExAllocatePool(NonPagedPool, requiredLength); if(pUserInfo){ ntStatus = NtQueryInformationToken(hToken, TokenUser, pUserInfo, requiredLength, &requiredLength); } } ZwClose(hToken); if(!NT_SUCCESS(ntStatus) || pUserInfo == NULL) { #if DBG DbgPrint("Error: %x", ntStatus); #endif if(pUserInfo) ExFreePool(pUserInfo); ExFreePool(pUserName); return; } memset(sidStringBuffer, 0, sizeof(sidStringBuffer)); sidString.Buffer = (PWCHAR)sidStringBuffer; sidString.MaximumLength = sizeof(sidStringBuffer); ntStatus = RtlConvertSidToUnicodeString(&sidString, pUserInfo->User.Sid, FALSE); #if DBG DbgPrint("Current SID is %ws", sidString.Buffer); #endif ExFreePool(pUserInfo); ExFreePool(pUserName); wcscpy(szRegPath, L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\"); wcsncat(szRegPath, sidString.Buffer, 511-wcslen(szRegPath)); if (GetRegString(szRegPath, L"ProfileImagePath", szValue, 255)) { #if DBG wchar_t *pszName = wcsrchr((wchar_t*)szValue, '\\'); pszName++; DbgPrint("Current User is %ws", pszName); #endif } }
если я правильно понял вопрос, проблема состоит в том, как определить, когда пользователь залогинился.. вот только нужно учесть, что одновременно может быть залогинено несколько пользователей
В этом и состоит проблема приведенного выше кода. По логике можно найти реального пользователя который сидит за компом к примеру так - поймать скан-код нажатия на клаве и сравнить с тем что получила активная прога, получить SID юзера который запустил эту прогу. - сложновато, но пройдет.