Problemer med at læse HID-enhed fra Windows 7-service (Session 0)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et problem med at læse fra en HID-enhed under en Session 0-tjeneste i Windows 7.
Under en normal desktop bruger kan jeg læse fra enheden fint. Når jeg forsøger at læse fra det ved at overlappe I/O under session 0, vender WaitForSingleObject () altid WAIT\_TIMEOUT, og bufferen til ReadFile indeholder aldrig gyldige data.
Dette virker som et Session 0-isoleringsproblem for mig, men jeg kan ikke finde noget om, hvordan man arbejder rundt om dette. Er læsning fra HID-enheder ikke-funktionelle under Session 0?


Tak.

Bedste reference


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


Åbn derefter din enhed med SQOS-parametrene:


ImpersonateConsoleSession(WTSGetActiveConsoleSessionId());
HANDLE hdevice = CreateFile(..., SECURITY\_SQOS\_PRESENT | SECURITY\_IDENTIFICATION, 0);
RevertToSelf();