#define WIN32_LEAN_AND_MEAN #include #include #include #pragma comment(lib, "winmm.lib") DWORD g_tls = 0; DWORD WINAPI Thread(PVOID p) { ULONGLONG count = 0; g_tls = TlsAlloc(); TlsSetValue(g_tls, &count); while(InterlockedCompareExchange((LONG*)p, 0, 0)) { Sleep(500); } DWORD time = timeGetTime(), endTime; SleepEx(0, TRUE); endTime = timeGetTime(); printf("Thread dispatched %I64u apcs, took %lu ms\n", count, endTime - time); TlsFree(g_tls); return 0; } VOID NTAPI Routine(PVOID, PVOID, PVOID) { ULONGLONG* pLong = (ULONGLONG*)TlsGetValue(g_tls); ++(*pLong); } int main() { LONG loopFlag = 1; HANDLE hThread = CreateThread(NULL, 0, &Thread, &loopFlag, 0, NULL); Sleep(250); NTSTATUS stat; ULONGLONG count = 0; ULONG a = 0, b = 0, c = 0; // just in case some caching of similar argumented apc's while(NT_SUCCESS(stat = NtQueueApcThread(hThread, &Routine, UlongToPtr(a), UlongToPtr(b), UlongToPtr(c)))) { ++count; ++a; b += (a / ULONG_MAX); c += (b / ULONG_MAX); } printf("Queued up %I64u APCs, fail status was %#8x\n", count, stat); InterlockedExchange(&loopFlag, 0); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); return 0; }