用堆栈中的锁变量来加锁是没有意义的,因为每个线程来执行都会用各自的锁了。
DRIVER_OBJECT中有一个派遣函数数组MajorFunctions[IRP_MJ_MAXIMUM_FUNCTION],还有一个单独的DriverUnload。
IoCreateDeviceSecure可以使应用层程序不具备管理员权限的情况下与驱动通信。

UNICODE_STRING uniStr = RTL_CONSTANT_STRING(L"uniStr");
UNICODE_STRING uniStr;
RtlInitUnicodeString(&uniStr, L"uniStr");

32位fastcall第一、二个参数使用ecx和edx传递。
64位使用rcx、rdx、r8和r9传递第一至四个参数。

指令前缀分为普通前缀(Prefixes)、指示性前缀(Mandatory Prefixes)和64位扩展前缀(REX Prefixes)。

LIST_ENTRY.Flink指向下一个LIST_ENTRY
LIST_ENTRY.Blink指向前一个LIST_ENTRY
LIST_ENTRY structure