Когда можно лезть в CURRENT_USER ?

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

  1. blockhead

    blockhead New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    11
    Задача следующая: В ветке current_user хранится информация, которая необходима драйверу в момент между логином пользователя и до того как загрузится управляющее приложение. Как из драйвера определить момент, когда можно лезть в current_user ?
     
  2. Guest

    Guest Guest

    Публикаций:
    0
    А такая ветка разве из под драйвера видна?
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Вообще нужно получить SID текущего пользователя и лезть в HKEY_USERS где в разделе с именем SID будет собственно ветка текущего пользователя аля HKEY_CURRENT_USER
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Вот тебе пример (только я его почти не тестил, и у него есть минус - он определяет юзера по explorer.exe, которых может быть несколько):

    Код (Text):
    1. VOID GetCurrentUserName()
    2. {
    3.     NTSTATUS  ntStatus;
    4.     HANDLE    hToken = NULL;;
    5.     PVOID     pToken = NULL;
    6.     PWCHAR    pUserName = NULL;
    7.     ULONG     requiredLength  = 0, PID = 0;
    8.     PEPROCESS pProcess = NULL;
    9.     PTOKEN_USER    pUserInfo = NULL;
    10.     UNICODE_STRING sidString;
    11.     CHAR           sidStringBuffer[512];
    12.     wchar_t        szRegPath[512], szValue[256];
    13.  
    14.     if ((PID = GetProcessIdByName(L"explorer.exe")) == 0)
    15.         return;
    16. #if DBG
    17.     dprintf("PID is %d", PID);
    18. #endif
    19.     if (!NT_SUCCESS(PsLookupProcessByProcessId((void*)PID, &pProcess)))
    20.         return;
    21.     if ((pToken = PsReferencePrimaryToken(pProcess)) == NULL)
    22.         return;
    23.  
    24.     pUserName = (PWCHAR)ExAllocatePool(NonPagedPool, FILE_NAME_LENGTH);
    25.     if(!pUserName) return;
    26.  
    27.     ntStatus = ObOpenObjectByPointer(pToken, 0, NULL, TOKEN_QUERY, NULL, KernelMode, &hToken);
    28.     ObDereferenceObject(pToken);
    29.     if(!NT_SUCCESS(ntStatus))
    30.     {
    31.         ExFreePool(pUserName);
    32.         return;
    33.     }
    34.     pUserInfo = (PTOKEN_USER)ExAllocatePool(NonPagedPool, FILE_NAME_LENGTH);
    35.     if(!pUserInfo)
    36.     {
    37.         ExFreePool(pUserName);
    38.         return;
    39.     }
    40.     ntStatus = NtQueryInformationToken(hToken, TokenUser, pUserInfo, FILE_NAME_LENGTH, &requiredLength);
    41.     if(ntStatus == STATUS_BUFFER_TOO_SMALL)
    42.     {
    43.         ExFreePool(pUserInfo);
    44.         pUserInfo = (PTOKEN_USER)ExAllocatePool(NonPagedPool, requiredLength);
    45.         if(pUserInfo){
    46.             ntStatus = NtQueryInformationToken(hToken, TokenUser, pUserInfo, requiredLength, &requiredLength);
    47.         }
    48.     }
    49.     ZwClose(hToken);
    50.     if(!NT_SUCCESS(ntStatus) || pUserInfo == NULL)
    51.     {
    52. #if DBG
    53.         DbgPrint("Error: %x", ntStatus);
    54. #endif
    55.         if(pUserInfo) ExFreePool(pUserInfo);
    56.         ExFreePool(pUserName);
    57.         return;
    58.     }
    59.  
    60.     memset(sidStringBuffer, 0, sizeof(sidStringBuffer));
    61.     sidString.Buffer        = (PWCHAR)sidStringBuffer;
    62.     sidString.MaximumLength = sizeof(sidStringBuffer);
    63.     ntStatus = RtlConvertSidToUnicodeString(&sidString, pUserInfo->User.Sid, FALSE);
    64. #if DBG
    65.     DbgPrint("Current SID is %ws", sidString.Buffer);
    66. #endif
    67.     ExFreePool(pUserInfo);
    68.     ExFreePool(pUserName);
    69.  
    70.     wcscpy(szRegPath, L"\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");
    71.     wcsncat(szRegPath, sidString.Buffer, 511-wcslen(szRegPath));
    72.     if (GetRegString(szRegPath, L"ProfileImagePath", szValue, 255))
    73.     {
    74. #if DBG
    75.         wchar_t *pszName = wcsrchr((wchar_t*)szValue, '\\');
    76.         pszName++;
    77.     DbgPrint("Current User is %ws", pszName);
    78. #endif
    79.     }
    80. }
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    если я правильно понял вопрос, проблема состоит в том, как определить, когда пользователь залогинился..
    вот только нужно учесть, что одновременно может быть залогинено несколько пользователей
     
  6. Guest

    Guest Guest

    Публикаций:
    0
    В этом и состоит проблема приведенного выше кода. По логике можно найти реального пользователя который сидит за компом к примеру так - поймать скан-код нажатия на клаве и сравнить с тем что получила активная прога, получить SID юзера который запустил эту прогу. - сложновато, но пройдет.