對於檔案操作:
我們的步驟應該是
1:---------------開啟我們指定的檔案(大部分是通過檔案名稱的得到這個檔案的操作控制代碼),可以使用 ZwOpenFile, ZwCreateFile....
當然,建立只能用第二個。。。
這是一個開啟已知檔案的例子:
NTSTATUS status;
OBJECT_ATTRIBUTES oa;
IO_STATUS_BLOCK iostatus;
HANDLE hfile; // the output from this process
PUNICODE_STRING pathname; // you've been given this
InitializeObjectAttributes(&oa, pathname, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = ZwCreateFile(&hfile,
GENERIC_READ,
&oa,
&iostatus,
NULL,
0,
FILE_SHARE_READ,
FILE_OPEN,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
建立或重寫檔案
為了建立一個新檔案,或開啟一個已存在檔案並截為 0 長度,用下面方式調用 ZwCreateFile 函數:
status = ZwCreateFile(&hfile,
GENERIC_WRITE,
&oa,
&iostatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
2:---------------拿到我們想要的檔案控制代碼後,我們將要對這個檔案進行處理了,read 還是 write ,wdk 給我們提供了ZwReadFile 和
ZwWriteFile 這兩個函數
讀寫的例子:
PVOID buffer;
ULONG bufsize;
status = ZwReadFile(hfile, NULL, NULL, NULL, &iostatus, buffer, bufsize, NULL, NULL);
status = ZwWriteFile(hfile, NULL, NULL, NULL, &iostatus, buffer, bufsize, NULL, NULL);
3:如果要對整個檔案的內容進行讀取:
那麼我們應該首Crowdsourced Security Testing道這個檔案的大小,然後在指定要讀取這個檔案的大小。。。
擷取整個檔案的大小:
FILE_STANDARD_INFORMATION si;
ZwQueryInformationFile(hfile, &iostatus, &si, sizeof(si), FileStandardInformation);
ULONG length = si.EndOfFile.LowPart;
4:當操作完後,我們應該關閉檔案的控制代碼,不然,下次不能對這個檔案進行其他的操作了。。。