В драйвере узнать имя пользователя

Тема в разделе "WASM.WIN32", создана пользователем mmb, 24 янв 2006.

  1. mmb

    mmb New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2006
    Сообщения:
    6
    Есть драйвер.

    Можно ли в процессе обработаки IRP_MJ_WRITE узнать имя пользователя, который работает с тем файлом, в который производится запись ?

    В случае работы по сети другие варианты не дают однозначного решения:dntknw:
     
  2. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Если драйвер взаимодействует с приложением пользовательского режима, можно копать в сторону функции NetUseEnum
     
  3. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    ищи в нете, там целый исходник есть )
     
  4. mmb

    mmb New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2006
    Сообщения:
    6
    Подскажите по каким словам хоть искать?
     
  5. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Код (Text):
    1. KQueryPrimarySidByProcess (
    2.    IN void *pSid,
    3.    IN ULONG dwSidLength,
    4.    IN PEPROCESS pEProcess
    5.    )
    6. {
    7.   if(
    8.       pEProcess == NULL ||
    9.       KeGetCurrentIrql() != PASSIVE_LEVEL
    10.      )
    11.     return 0;
    12.  
    13.   ULONG    dwSidLengthReal = 0;
    14.   HANDLE   hToken = NULL;
    15.   NTSTATUS NtStatus;
    16.  
    17.   void *pToken = PsReferencePrimaryToken(pEProcess);
    18.   if (pToken != NULL)
    19.   {
    20.     NtStatus = ObOpenObjectByPointer(pToken, 0, 0, TOKEN_QUERY, 0, KernelMode, &hToken);
    21.     if (NT_SUCCESS(NtStatus))
    22.     {
    23.       ULONG dwSizeOfToken = 0;
    24.       NtStatus = ZwQueryInformationToken(hToken, TokenUser, NULL, 0, &dwSizeOfToken);
    25.       if (NtStatus == STATUS_BUFFER_TOO_SMALL)
    26.       {
    27.         PTOKEN_USER pTokenUser = (PTOKEN_USER)  new char[dwSizeOfToken];
    28.         if (pTokenUser != NULL)
    29.         {
    30.           NtStatus = ZwQueryInformationToken(hToken, TokenUser, pTokenUser, dwSizeOfToken, &dwSizeOfToken);
    31.           if (NT_SUCCESS(NtStatus))
    32.           {
    33.             if (RtlValidSid(pTokenUser->User.Sid) == TRUE)
    34.             {
    35.               dwSidLengthReal = RtlLengthSid(pTokenUser->User.Sid);
    36.               if (dwSidLengthReal != 0 && dwSidLengthReal <= dwSidLength && pSid != NULL)
    37.               {
    38.                 RtlCopySid(dwSidLengthReal, pSid, pTokenUser->User.Sid);
    39.               }
    40.             }
    41.           }
    42.           delete[] (char*) pTokenUser;
    43.         }
    44.       }
    45.       ZwClose(hToken);
    46.     }
    47.  
    48.     ObDereferenceObject(pToken);
    49.   return dwSidLengthReal;
    50.   }
     
  6. mmb

    mmb New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2006
    Сообщения:
    6
    Но в случае работы драйвер-фильтра на сервере токен процесса будет отличаться от токена пользователя вызвавшего этот процесс на сервере?