KeSetEvent(&Context->StartWorkEvent, IO_NO_INCREMENT, TRUE);
return WaitForWork(Context, MilliSeconds);
}
-
-PKTHREAD
-KmtStartThread(
- IN PKSTART_ROUTINE StartRoutine,
- IN PVOID StartContext OPTIONAL)
-{
- NTSTATUS Status;
- OBJECT_ATTRIBUTES ObjectAttributes;
- HANDLE ThreadHandle;
- PVOID ThreadObject = NULL;
-
- InitializeObjectAttributes(&ObjectAttributes,
- NULL,
- OBJ_KERNEL_HANDLE,
- NULL,
- NULL);
- ThreadHandle = INVALID_HANDLE_VALUE;
- Status = PsCreateSystemThread(&ThreadHandle,
- SYNCHRONIZE,
- &ObjectAttributes,
- NULL,
- NULL,
- StartRoutine,
- StartContext);
- ok_eq_hex(Status, STATUS_SUCCESS);
- if (!skip(NT_SUCCESS(Status) && ThreadHandle != NULL && ThreadHandle != INVALID_HANDLE_VALUE, "No thread\n"))
- {
- Status = ObReferenceObjectByHandle(ThreadHandle,
- SYNCHRONIZE,
- PsThreadType,
- KernelMode,
- &ThreadObject,
- NULL);
- ok_eq_hex(Status, STATUS_SUCCESS);
- ObCloseHandle(ThreadHandle, KernelMode);
- }
- return ThreadObject;
-}
-
-VOID
-KmtFinishThread(
- IN PKTHREAD Thread OPTIONAL,
- IN PKEVENT Event OPTIONAL)
-{
- NTSTATUS Status;
-
- if (skip(Thread != NULL, "No thread\n"))
- return;
-
- if (Event)
- KeSetEvent(Event, IO_NO_INCREMENT, TRUE);
- Status = KeWaitForSingleObject(Thread,
- Executive,
- KernelMode,
- FALSE,
- NULL);
- ok_eq_hex(Status, STATUS_SUCCESS);
- ObDereferenceObject(Thread);
-}