Есть драйвер. Можно ли в процессе обработаки IRP_MJ_WRITE узнать имя пользователя, который работает с тем файлом, в который производится запись ? В случае работы по сети другие варианты не дают однозначного решения
Если драйвер взаимодействует с приложением пользовательского режима, можно копать в сторону функции NetUseEnum
Код (Text): KQueryPrimarySidByProcess ( IN void *pSid, IN ULONG dwSidLength, IN PEPROCESS pEProcess ) { if( pEProcess == NULL || KeGetCurrentIrql() != PASSIVE_LEVEL ) return 0; ULONG dwSidLengthReal = 0; HANDLE hToken = NULL; NTSTATUS NtStatus; void *pToken = PsReferencePrimaryToken(pEProcess); if (pToken != NULL) { NtStatus = ObOpenObjectByPointer(pToken, 0, 0, TOKEN_QUERY, 0, KernelMode, &hToken); if (NT_SUCCESS(NtStatus)) { ULONG dwSizeOfToken = 0; NtStatus = ZwQueryInformationToken(hToken, TokenUser, NULL, 0, &dwSizeOfToken); if (NtStatus == STATUS_BUFFER_TOO_SMALL) { PTOKEN_USER pTokenUser = (PTOKEN_USER) new char[dwSizeOfToken]; if (pTokenUser != NULL) { NtStatus = ZwQueryInformationToken(hToken, TokenUser, pTokenUser, dwSizeOfToken, &dwSizeOfToken); if (NT_SUCCESS(NtStatus)) { if (RtlValidSid(pTokenUser->User.Sid) == TRUE) { dwSidLengthReal = RtlLengthSid(pTokenUser->User.Sid); if (dwSidLengthReal != 0 && dwSidLengthReal <= dwSidLength && pSid != NULL) { RtlCopySid(dwSidLengthReal, pSid, pTokenUser->User.Sid); } } } delete[] (char*) pTokenUser; } } ZwClose(hToken); } ObDereferenceObject(pToken); return dwSidLengthReal; }
Но в случае работы драйвер-фильтра на сервере токен процесса будет отличаться от токена пользователя вызвавшего этот процесс на сервере?