2010-12-14 1 views
2

Windows 7의 세션 0 서비스에서 HID 장치를 읽는 데 문제가 있습니다. 일반 데스크톱 사용자의 경우 장치에서 잘 읽을 수 있습니다. 그러나 세션 0에서 겹친 I/O를 사용하여 읽으려고하면 WaitForSingleObject()는 항상 WAIT_TIMEOUT을 반환하고 ReadFile의 버퍼에는 유효한 데이터가 포함되지 않습니다. 이 문제는 나에게 세션 0 격리 문제로 보이지만이 문제를 해결하는 방법은 찾을 수 없습니다. 세션 0에서 HID 장치 읽기 기능이 작동하지 않습니까?Windows 7 서비스 (세션 0)에서 HID 장치 읽기 관련 문제

감사합니다.

답변

1
void ImpersonateConsoleSession(DWORD dwSessionId) 
{ 
    PROCESSENTRY32 procEntry; 
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    procEntry.dwSize = sizeof(PROCESSENTRY32); 
    Process32First(hSnap, &procEntry); 
    DWORD winlogonPid = 0; 
    do { 
     if (!wcscmp(procEntry.szExeFile, L"winlogon.exe")) 
     { 
      DWORD winlogonSessId = 0; 
      if (ProcessIdToSessionId(procEntry.th32ProcessID, &winlogonSessId) && winlogonSessId == dwSessionId) 
      { 
       winlogonPid = procEntry.th32ProcessID; 
       break; 
      } 
     } 
    } while (Process32Next(hSnap, &procEntry) != 0); 
    CloseHandle(hSnap); 
    if (winlogonPid) 
    { 
     HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, 0, winlogonPid); 
     HANDLE hPToken; 
     OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE, &hPToken); 
     CloseHandle(hProcess); 
     HANDLE hUserTokenDup; 
     DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, 0, SecurityIdentification, TokenPrimary, &hUserTokenDup); 
     CloseHandle(hPToken); 
     ImpersonateLoggedOnUser(hUserTokenDup); 
     CloseHandle(hUserTokenDup); 
    } 
} 

그런 다음 SQOS 매개 변수를 사용하여 장치를 엽니 다

ImpersonateConsoleSession(WTSGetActiveConsoleSessionId()); 
HANDLE hdevice = CreateFile(..., SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, 0); 
RevertToSelf();