背景
我正在尝试设置一个具有给定名称的事件,以确定该应用程序是否已排队某个给定任务。
我正在使用NtCreateEvent
和NtOpenEvent
,因此我为每个编写了2个包装函数。
NtCreateEvent
HANDLE CreateEvent(PCHAR EventName) {
UNICODE_STRING uString;
Rtl::InitUnicodeString(&uString,
Str::ConvertAnsiToUnicode(EventName));
OBJECT_ATTRIBUTES ObjAttributes;
InitializeObjectAttributes(&ObjAttributes,
&uString, 0, NULL, 0);
HANDLE hEvent;
NTSTATUS Status = NtCreateEvent(&hEvent, EVENT_MODIFY_STATE, &ObjAttributes, 1, 0);
if (NT_SUCCESS(Status)) {
if (Status != STATUS_OBJECT_NAME_EXISTS) {
Nt::SetLastError(ERROR_SUCCESS);
} else {
Nt::SetLastError(ERROR_ALREADY_EXISTS);
}
}
return hEvent;
}
NtOpenEvent
BOOL OpenEvent(PCHAR EventName) {
UNICODE_STRING uString;
Rtl::InitUnicodeString(&uString,
Str::ConvertAnsiToUnicode(EventName));
OBJECT_ATTRIBUTES ObjAttributes;
InitializeObjectAttributes(&ObjAttributes,
&uString, 0, NULL, 0);
HANDLE hEvent;
if (NT_SUCCESS(NtOpenEvent(&hEvent, EVENT_QUERY_STATE, &ObjAttributes))) {
return TRUE;
}
return FALSE;
}
备注
我的检查是按照这些方式进行的
if (!Nt::OpenEvent("Global\\taskname")) {
// do something
Nt::CreateEvent("Global\\taskname");
} else {
// work with the task
}
问题
我做错了什么? EventName
如何拥有BAD_PATHNAME
?