WCHAR SparseFilename[] = L"\\??\\E:\\temp.dat";
UNICODE_STRING SparseFilenameUni;
//建立文件时的io操作状态值
IO_STATUS_BLOCK ios = { 0 };
//建立文件时的对象属性变量
OBJECT_ATTRIBUTES ObjAttr = { 0 };
//设置文件大小的时候使用的文件结尾描述符
FILE_END_OF_FILE_INFORMATION FileEndInfo = { 0 };
//打开我们将要用来做转储的文件
//初始化要打开的文件名
RtlInitUnicodeString(&SparseFilenameUni,SparseFilename);
//初始化文件名对应的对象名,这里需要将其初始化为内核对象,并且大小写不敏感
InitializeObjectAttributes(
&ObjAttr,
&SparseFilenameUni,
OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
NULL,
NULL);
//建立文件,这里需要注意的是,要加入FILE_NO_INTERMEDIATE_BUFFERING选项,避免文件系统再缓存这个文件
ntStatus = ZwCreateFile(
&gProtectDevExt->TempFile,
GENERIC_READ | GENERIC_WRITE,
&ObjAttr,
&ios,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
FILE_NON_DIRECTORY_FILE |
FILE_RANDOM_ACCESS |
FILE_SYNCHRONOUS_IO_NONALERT |
FILE_NO_INTERMEDIATE_BUFFERING,
NULL,
0);