typedef struct _DEVICE_EXTENSION {
//media_in_device是指这个设备是否已经指定了一个文件作为存储媒质。
//这是一个用文件来虚拟磁盘的驱动。那么一个磁盘应该对应一个实际存在的文件。
//读写这个磁盘的请求最终转变为对文件的读写。
//如果一个磁盘设备对象还没有指定文件,那么这个内容是FALSE。
BOOLEAN media_in_device;
//file_handle是文件句柄。也就是这个虚拟磁盘所对应的文件。
HANDLE file_handle;
//file_information是这个文件的一些信息。
ANSI_STRING file_name;
LARGE_INTEGER file_size;
//read_only是否只读
BOOLEAN read_only;
//访问文件的时候需要使用的一个线程客户安全性上下文
PSECURITY_CLIENT_CONTEXT security_client_context;
//是一个链表头。一部分irp(windows发来的请求包)被放入这个链表中。
//我们为每个磁盘对象开启一个系统线程(处理线程),专门用来处理这些请求。
LIST_ENTRY list_head;
//是为了保证链表读写同步的锁
KSPIN_LOCK list_lock;
//是一个事件。当链表中没有请求的时候,处理请求的系统线程并不做任何事情,
//而只等待这个事件。当有请求到来,我们把请求放入链表,然后设置这个事件。
//处理线程就会开始处理这些请求。
KEVENT request_event;
//是线程的指针,用来最后等待这个线程的结束。
PVOID thread_pointer;
//是一个标志。如果设置为TRUE,处理线程执行的时候检测到这个,就会把自己终止掉。
BOOLEAN terminate_thread;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;