2010-12-14 69 views
2

我在Windows 7的Session 0服务下从HID设备读取时遇到问题。 在正常的桌面用户下,我可以正常读取设备。但是,当我尝试使用会话0下的重叠I/O读取它时,WaitForSingleObject()始终返回WAIT_TIMEOUT,并且ReadFile的缓冲区永远不会包含任何有效数据。 这对我来说似乎是一个Session 0隔离问题,但我找不到任何有关如何解决此问题的方法。在会话0下,HID设备是否无法读取?从Windows 7服务读取HID设备时出现问题(会话0)

感谢。

回答

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(); 
相关问题