从Windows 7服务读取HID设备时出现问题(会话0)

从Windows 7服务读取HID设备时出现问题(会话0),windows,windows-7,service,hid,Windows,Windows 7,Service,Hid,我在Windows 7中会话0服务下读取HID设备时遇到问题。 在普通桌面用户的情况下,我可以很好地读取设备。但是,当我尝试在会话0下使用重叠I/O从中读取时,WaitForSingleObject()总是返回WAIT_TIMEOUT,并且ReadFile的缓冲区从不包含任何有效数据。 对我来说,这似乎是会话0隔离问题,但我找不到任何关于如何解决此问题的方法。会话0下从HID设备读取是否不起作用 谢谢 void ImpersonateConsoleSession(DWORD dwSessionI

我在Windows 7中会话0服务下读取HID设备时遇到问题。 在普通桌面用户的情况下,我可以很好地读取设备。但是,当我尝试在会话0下使用重叠I/O从中读取时,WaitForSingleObject()总是返回WAIT_TIMEOUT,并且ReadFile的缓冲区从不包含任何有效数据。 对我来说,这似乎是会话0隔离问题,但我找不到任何关于如何解决此问题的方法。会话0下从HID设备读取是否不起作用

谢谢

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