2010-12-14 109 views
2

J'ai un problème de lecture d'un périphérique HID sous un service Session 0 dans Windows 7. Sous un utilisateur de bureau normal, je peux lire correctement à partir du périphérique. Toutefois, lorsque j'essaie de lire à l'aide des E/S superposées sous Session 0, WaitForSingleObject() renvoie toujours WAIT_TIMEOUT et le tampon à ReadFile ne contient jamais de données valides. Cela me semble être un problème d'isolation de Session 0, mais je ne trouve rien sur la façon de contourner ce problème. La lecture des périphériques HID est-elle non fonctionnelle sous la session 0?Problèmes de lecture du périphérique HID du service Windows 7 (session 0)

Merci.

Répondre

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); 
    } 
} 

Ensuite, ouvrez votre appareil avec les paramètres SQOS:

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