2010-12-14 7 views
2

Windows 7のセッション0サービスでHIDデバイスからの読み取りに問題があります。 通常のデスクトップユーザーの下では、デバイスから細かく読み取ることができます。しかし、セッション0でオーバーラップI/Oを使用して読み込みしようとすると、WaitForSingleObject()は常にWAIT_TIMEOUTを返し、バッファには有効なデータが含まれません。 これはセッション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(); 
関連する問題