日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
網(wǎng)絡(luò)安全編程:內(nèi)核下文件讀寫(xiě)函數(shù)

文件讀寫(xiě)程序分為4個(gè)函數(shù),分別是DriverUnload()、DriverEntry()、CreateFileTest()和OpenFileTest()。這4個(gè)函數(shù)的功能非常明確,DriverUnload()是一個(gè)卸載例程,DriverEntry()是驅(qū)動(dòng)程序的入口,CreateFileTest()是用來(lái)新建文件的,OpenFileTest()是用來(lái)打開(kāi)已建立文件并進(jìn)行讀寫(xiě)的函數(shù)。

創(chuàng)新互聯(lián)建站是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計(jì)公司的優(yōu)秀設(shè)計(jì)人員和策劃人員組成的一個(gè)具有豐富經(jīng)驗(yàn)的團(tuán)隊(duì),其中包括網(wǎng)站策劃、網(wǎng)頁(yè)美工、網(wǎng)站程序員、網(wǎng)頁(yè)設(shè)計(jì)師、平面廣告設(shè)計(jì)師、網(wǎng)絡(luò)營(yíng)銷(xiāo)人員及形象策劃。承接:成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫(kù)開(kāi)發(fā),以高性價(jià)比制作企業(yè)網(wǎng)站、行業(yè)門(mén)戶平臺(tái)等全方位的服務(wù)。

1. 文件的創(chuàng)建、打開(kāi)與關(guān)閉

對(duì)于文件的創(chuàng)建或打開(kāi),在內(nèi)核驅(qū)動(dòng)中都是通過(guò)內(nèi)核函數(shù)ZwCreateFile()進(jìn)行操作的。和Win32 API類(lèi)似,會(huì)通過(guò)參數(shù)接收返回的文件句柄。它的返回值是一個(gè)操作是否成功的狀態(tài)碼。ZwCreateFile()函數(shù)的定義如下:

 
 
  1. NTSTATUS ZwCreateFile(  
  2.  __out PHANDLE FileHandle,  
  3.  __in ACCESS_MASK DesiredAccess,  
  4.  __in POBJECT_ATTRIBUTES ObjectAttributes,  
  5.  __out PIO_STATUS_BLOCK IoStatusBlock,  
  6.  __in_opt PLARGE_INTEGER AllocationSize,  
  7.  __in ULONG FileAttributes,  
  8.  __in ULONG ShareAccess,  
  9.  __in ULONG CreateDisposition,  
  10.  __in ULONG CreateOptions,  
  11.  __in_opt PVOID EaBuffer,  
  12.  __in ULONG EaLength  
  13. );  

參數(shù)介紹如下。

FileHandle:用來(lái)接收創(chuàng)建文件后的文件句柄。

DesiredAccess:打開(kāi)文件操作的描述,讀或?qū)懀话阒付?GENERIC_READ 或 GENERIC_WRITE;該參數(shù)和 CreateFile()函數(shù)中的參數(shù)相同。

ObjectAttributes:指向 OBJECT_ATTRIBUTES 結(jié)構(gòu)體的指針,該結(jié)構(gòu)體包含要?jiǎng)?chuàng)建或打開(kāi)的文件名。

IoStatusBlock:指向 IO_STATUS_BLOCK 結(jié)構(gòu)體的指針,該結(jié)構(gòu)體用于接收操作結(jié)果的狀態(tài)。

AllocationSize:該參數(shù)指向一個(gè) 64 位的整數(shù),用于文件初始化分配時(shí)的大小。

FileAttributes:通常為 FILE_ATTRIBUTE_NORMAL,該參數(shù)和 CreateFile()函數(shù)中的參數(shù)相同。

ShareAccess:指定文件的共享方式,可以指定為 FILE_SHARE_READ、FILE_SHARE_WRITE 或 FILE_SHARE_DELETE,該參數(shù)和 CreateFile()函數(shù)中的參數(shù)相同。

CreateDisposition:描述本次調(diào)用 ZwCreateFile()函數(shù)的意圖,可以指定為 FILE_CREATE、FILE_OPEN、FILE_OPEN_IF 等。

CreateOptions:通常指定為 FILE_SYNCHRONOUS_IO_NONALERT,表示文件是同步操作,比如在寫(xiě)入文件時(shí),調(diào)用 ZwWriteFile()函數(shù),在 ZwWriteFile()調(diào)用返回時(shí),文件寫(xiě)操作已經(jīng)完成。

EaBuffer:該參數(shù)表示一個(gè)指針,指向可選的擴(kuò)展屬性區(qū),一般為 NULL。

EaLength:該參數(shù)表示擴(kuò)展屬性區(qū)的長(zhǎng)度,一般為 0。

ZwCreateFile()函數(shù)的第 3 個(gè)參數(shù)是一個(gè)指向 OBJECT_ATTRIBUTES 的結(jié)構(gòu)體,該結(jié)構(gòu)體的定義如下:

 
 
  1. typedef struct _OBJECT_ATTRIBUTES {  
  2.  ULONG Length;  
  3.  HANDLE RootDirectory;  
  4.  PUNICODE_STRING ObjectName;  
  5.  ULONG Attributes;  
  6.  PVOID SecurityDescriptor;  
  7.  PVOID SecurityQualityOfService;  
  8. } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;  
  9. typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES; 

該結(jié)構(gòu)體通常不需要用戶逐個(gè)進(jìn)行初始化,而是使用InitializeObjectAttributes()函數(shù)進(jìn)行初始化,該函數(shù)的定義如下:

 
 
  1. VOID InitializeObjecttAttributes(  
  2.  OUT POBJECT_ATTRIBUTES InitializedAttributes,  
  3.  IN PUNICODE_STRING ObjectName,  
  4.  IN ULONG Attributes,  
  5.  IN HANDLE RootDirectory,  
  6.  IN PSECURITY_DESCRIPTOR SecurityDescriptor  
  7. );  

從InitializeObjectAttributes()函數(shù)的定義可以看出,其參數(shù)與OBJECT_ATTRIBUTES結(jié)構(gòu)體的成員變量相同。InitializeObjectAttributes()函數(shù)的參數(shù)說(shuō)明如下。

InitializeAttributes:指向 OBJECT_ATTRIBUTES 結(jié)構(gòu)體的指針。

ObjectName:對(duì)象名稱,用 UNICODE_STRING 描述,對(duì)于 ZwCreateFile()函數(shù)而言,該處指定為文件名。

Attributes:一般設(shè)置為 OBJ_CASE_INSENSITIVE,意味著名字字符串不區(qū)分大小寫(xiě)。

RootDirectory:一般設(shè)置為 NULL。

SecurityDescriptor:用于設(shè)置安全描述符,一般設(shè)置為 NULL。

ObjectName 必須使用 UNICODE_STRING 類(lèi)型進(jìn)行描述,UNICODE_STRING 是內(nèi)核對(duì)寬字符串封裝的一種數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)體的定義如下:

 
 
  1. typedef struct _UNICODE_STRING {  
  2.  USHORT Length;  
  3.  USHORT MaximumLength;  
  4.  PWSTR Buffer;  
  5. } UNICODE_STRING, *PUNICODE_STRING; 

結(jié)構(gòu)體成員說(shuō)明如下。

Length:字符串的參數(shù),單位是字節(jié),如果是 N 個(gè)字符,那幺 Length 的值為 N 個(gè)字符的 2 倍。

MaximumLength:整個(gè)字符緩沖區(qū)的最大長(zhǎng)度,單位是字節(jié)。

Buffer:緩沖區(qū)的指針。

對(duì)于 UNICODE_STRING 類(lèi)型的字符串,通過(guò) KdPrint()也可以進(jìn)行調(diào)試輸出,輸出的方式類(lèi)似如下:

 
 
  1. UNICODE_STRING uniString;  
  2. KdPrint(("%wZ", &uniString)); 

UNICODE_STRING類(lèi)型的字符串在使用前需要進(jìn)行初始化,初始化的方法有兩種:一種是使用內(nèi)核函數(shù)RtlInitUnicodeString()進(jìn)行初始化,另一種方式是自行申請(qǐng)內(nèi)存空間來(lái)進(jìn)行初始化。通常情況下都是用第1種方法。RtlInitUnicodeString()函數(shù)的定義如下:

 
 
  1. VOID RtlInitUnicodeString(  
  2.  IN OUT PUNICODE_STRING DestinationString,  
  3.  IN PCWSTR SourceString  
  4. );  

參數(shù)說(shuō)明如下。

DestinationString:要初始化的 UNICODE_STRING 字符串的指針。

SourceString:字符串的內(nèi)容。

在為InitializeObjectAttributes()函數(shù)傳遞第2個(gè)參數(shù)時(shí),需要指定的文件名是一個(gè)符號(hào)鏈接。在應(yīng)用層下,描述一個(gè)文件的完整路徑是“c:\a.txt”;而在內(nèi)核下,描述的方式為“\??\c:\a.txt”。符號(hào)鏈接在內(nèi)核模式下以“\??\”(或者是“\DosDevices\”)開(kāi)頭;在用戶模式下使用符號(hào)鏈接,則以“\\.\”開(kāi)頭。

上面介紹的ZwCreateFile()函數(shù)不但可以創(chuàng)建文件,還可以打開(kāi)文件。但是由于它的參數(shù)過(guò)于繁多,因此內(nèi)核函數(shù)中專(zhuān)門(mén)提供了一個(gè)用于進(jìn)行文件打開(kāi)的函數(shù)ZwOpenFile(),其定義如下:

 
 
  1. NTSTATUS ZwOpenFile(  
  2.  OUT PHANDLE FileHandle,  
  3.  IN ACCESS_MASK DesiredAccess,  
  4.  IN POBJECT_ATTRIBUTES ObjectAttributes,  
  5.  OUT PIO_STATUS_BLOCK IoStatusBlock,  
  6.  IN ULONG ShareAccess,  
  7.  IN ULONG OpenOptions  
  8. );  

ZwOpenFile()函數(shù)相當(dāng)于一個(gè)只用來(lái)打開(kāi)文件的精簡(jiǎn)版的ZwCreateFile()函數(shù),其各參數(shù)使用方法與ZwCreateFile()函數(shù)相同,這里不重復(fù)介紹。

文件句柄的關(guān)閉使用內(nèi)核函數(shù)ZwClose(),其定義如下:

 
 
  1. NTSTATUS ZwClose(IN HANDLE Handle); 

該函數(shù)只包含一個(gè)參數(shù),即被打開(kāi)文件的句柄。該函數(shù)除了可以關(guān)閉文件句柄以外,還可以關(guān)閉其它類(lèi)型資源的句柄,比如注冊(cè)表句柄等。

2. 文件的相關(guān)操作

文件相關(guān)的操作主要介紹4個(gè)內(nèi)核函數(shù),分別是ZwReadFile()、ZwWriteFile()、ZwQueryInformationFile()和ZwSetInformationFile()。例子代碼中實(shí)現(xiàn)了對(duì)文件的讀寫(xiě)操作,判斷打開(kāi)的文件是否為目錄,獲取文件的長(zhǎng)度和設(shè)置文件的指針。

首先來(lái)看ZwQueryInformationFile()和ZwSetInformationFile()兩個(gè)函數(shù)的定義。ZwQueryIn formationFile()函數(shù)的定義如下:

 
 
  1. NTSTATUS ZwQueryInformationFile(  
  2.  IN HANDLE FileHandle,  
  3.  OUT PIO_STATUS_BLOCK IoStatusBlock,  
  4.  OUT PVOID FileInformation,  
  5.  IN ULONG Length,  
  6.  IN FILE_INFORMATION_CLASS FileInformationClass  
  7. );  

參數(shù)說(shuō)明如下。

FileHandle:被打開(kāi)的文件句柄。

IoStatusBlock:返回設(shè)置的狀態(tài)。

FileInformation:依據(jù) FileInformationClass 的不同而不同。

Length:FileInformation 數(shù)據(jù)的長(zhǎng)度。

FileInformationClass:描述需獲取的屬性類(lèi)型。

ZwSetInformationFile()函數(shù)的定義如下:

 
 
  1. NTSTATUS ZwSetInformationFile(  
  2.  IN HANDLE FileHandle,  
  3.  OUT PIO_STATUS_BLOCK IoStatusBlock,  
  4.  IN PVOID FileInformation,  
  5.  IN ULONG Length,  
  6.  IN FILE_INFORMATION_CLASS FileInformationClass  
  7. );  

ZwSetInformationFile()函數(shù)的參數(shù)與 ZwQueryInformationFile()函數(shù)的參數(shù)幾乎相同,但是兩個(gè)函數(shù)的第 3 個(gè)參數(shù)稍有差別,差別在于對(duì) ZwQueryInformationFile()來(lái)說(shuō)是一個(gè)輸出參數(shù),對(duì)于 ZwSetInformationFile()來(lái)說(shuō)是一個(gè)輸入?yún)?shù)。這里一定要注意。

對(duì)于ZwQueryInformationFile()和ZwSetInformationFile()這兩個(gè)函數(shù)來(lái)說(shuō),第5個(gè)參數(shù)決定了要讀取或設(shè)置的屬性的類(lèi)型,第3個(gè)參數(shù)根據(jù)第5個(gè)參數(shù)來(lái)接受或傳遞相應(yīng)的值。

兩個(gè)函數(shù)的第5個(gè)參數(shù)的常用值有3種類(lèi)型,分別是FileStandardInformation、FileBasic Information和FilePositionInformation。每種類(lèi)型分別又對(duì)應(yīng)不同的結(jié)構(gòu)體,這些結(jié)構(gòu)體則是被ZwQueryInformationFile()和ZwSetInformationFile()函數(shù)的第3個(gè)參數(shù)所用。

FileStandardInformation對(duì)應(yīng)的結(jié)構(gòu)體定義如下:

 
 
  1. typedef struct FILE_STANDARD_INFORMATION {  
  2.  LARGE_INTEGER AllocationSize; // 為文件分配的大?。ㄕ加么厮璐笮。?nbsp; 
  3.  LARGE_INTEGER EndOfFile; // 距離文件結(jié)尾的字節(jié)數(shù)  
  4.  ULONG NumberOfLinks; // 有多少個(gè)鏈接文件  
  5.  BOOLEAN DeletePending; // 是否準(zhǔn)備刪除  
  6.  BOOLEAN Directory; // 是否為目錄  
  7. } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; 

FileBasicInformation對(duì)應(yīng)的結(jié)構(gòu)體定義如下:

 
 
  1. typedef struct FILE_BASIC_INFORMATION {  
  2.  LARGE_INTEGER CreationTime; // 文件創(chuàng)建時(shí)間  
  3.  LARGE_INTEGER LastAccessTime; // 最后訪問(wèn)時(shí)間  
  4.  LARGE_INTEGER LastWriteTime; // 最后寫(xiě)入時(shí)間  
  5.  LARGE_INTEGER ChangeTime; // 修改時(shí)間  
  6.  ULONG FileAttributes; // 文件屬性  
  7. } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; 

FilePositionInformation對(duì)應(yīng)的結(jié)構(gòu)體定義如下:

 
 
  1. typedef struct FILE_POSITION_INFORMATION {  
  2.  LARGE_INTEGER CurrentByteOffset; // 當(dāng)前文件指針位置  
  3. } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; 

明白了第3個(gè)參數(shù)和第5個(gè)參數(shù)以后,就可以清楚第4個(gè)參數(shù)的取值了,該取值是第3個(gè)參數(shù)的大小。

上面的結(jié)構(gòu)體中大量使用了LARGE_INTEGER的數(shù)據(jù)類(lèi)型,它其實(shí)是一個(gè)聯(lián)合體。LARGE_INTEGER的定義如下:

 
 
  1. typedef union _LARGE_INTEGER {  
  2.   struct {  
  3.     ULONG LowPart;  
  4.     LONG HighPart;  
  5.   };  
  6.   struct {  
  7.     ULONG LowPart;  
  8.     LONG HighPart;  
  9.   } u;  
  10.   LONGLONG QuadPart;  
  11. } LARGE_INTEGER; 

該結(jié)構(gòu)體主要是用來(lái)表示64位的整數(shù)類(lèi)型,通常使用其QuadPart成員。

ZwReadFile()函數(shù)的定義如下:

 
 
  1. NTSTATUS ZwReadFile(  
  2.  IN HANDLE FileHandle,  
  3.  IN HANDLE Event OPTIONAL,  
  4.  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,  
  5.  IN PVOID ApcContext OPTIONAL,  
  6.  OUT PIO_STATUS_BLOCK IoStatusBlock,  
  7.  OUT PVOID Buffer,  
  8.  IN ULONG Length,  
  9.  IN PLARGE_INTEGER ByteOffset OPTIONAL,  
  10.  IN PULONG Key OPTIONAL  
  11. ); 

參數(shù)說(shuō)明如下。

FileHandle:打開(kāi)文件的句柄。

Event:用于異步完成讀取時(shí),一般設(shè)置為 NULL。

ApcRoutine:回調(diào)例程,用于異步完成讀取時(shí),一般設(shè)置為 NULL。

ApcContext:一般設(shè)置為 NULL。

IoStatusBlock:指向 IO_STATUS_BLOCK 的指針,記錄讀取操作的狀態(tài),IoStatusBlock.Information 用于記錄讀取的字節(jié)數(shù)。

Buffer:保存讀取文件內(nèi)容的緩沖區(qū)。

Length:準(zhǔn)備讀取文件內(nèi)容的字節(jié)數(shù)。

ByteOffset:指定讀取內(nèi)容的偏移地址。

Key:讀取文件時(shí)的附加信息,一般設(shè)置為 NULL。

ZwWriteFile()函數(shù)的定義如下:

 
 
  1. NTSTATUS ZwWriteFile(  
  2.  IN HANDLE FileHandle,  
  3.  IN HANDLE Event OPTIONAL,  
  4.  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,  
  5.  IN PVOID ApcContext OPTIONAL,  
  6.  OUT PIO_STATUS_BLOCK IoStatusBlock,  
  7.  IN PVOID Buffer,  
  8.  IN ULONG Length,  
  9.  IN PLARGE_INTEGER ByteOffset OPTIONAL,  
  10.  IN PULONG Key OPTIONAL  
  11. );  

該函數(shù)的參數(shù)類(lèi)似于ZwReadFile()函數(shù),Buffer中保存的是欲寫(xiě)入文件內(nèi)容的緩沖區(qū)。

3. 內(nèi)存管理函數(shù)

文件讀寫(xiě)代碼中用到了3個(gè)內(nèi)存相關(guān)的內(nèi)核函數(shù),分別是ExAllocatePool()、RtlFillMem ory()和ExFreePool()。

ExAllocatePool()函數(shù)用于申請(qǐng)一塊內(nèi)存空間,其定義如下:

 
 
  1. PVOID ExAllocatePool(  
  2.  IN POOL_TYPE PoolType,  
  3.  IN SIZE_T NumberOfBytes  
  4. );  

參數(shù)說(shuō)明如下。

PoolType:該參數(shù)是一個(gè)枚舉值,常用的值有兩個(gè),分別是 NonPagedPool 和 PagedPool;前者表示非分頁(yè)內(nèi)存,而后者表示分頁(yè)內(nèi)存;永遠(yuǎn)不會(huì)被交換到文件中的虛擬內(nèi)存稱為非分頁(yè)內(nèi)存,可以被交換到文件中的虛擬內(nèi)存稱為分頁(yè)內(nèi)存。

NumberOfBytes:表示需要分配的內(nèi)存大小。

該函數(shù)的返回值是一個(gè)內(nèi)存地址。

RtlFillMemory()函數(shù)用于填充內(nèi)存,其定義如下:

 
 
  1. VOID RtlFillMemory(  
  2.  IN VOID UNALIGNED *Destination,  
  3.  IN SIZE_T Length,  
  4.  IN UCHAR Fill  
  5. );  

參數(shù)說(shuō)明如下。

Desination:填充內(nèi)存地址的起始位置。

Length:填充的長(zhǎng)度。

Fill:需要填充的字節(jié)。

ExFreePool()函數(shù)用于回收 ExAllocatePool()申請(qǐng)的內(nèi)存空間,其定義如下:

 
 
  1. VOID ExFreePool(IN PVOID P); 

該函數(shù)只有一個(gè)參數(shù),是指向ExAllocatePool()函數(shù)分配內(nèi)存空間的指針。


分享名稱:網(wǎng)絡(luò)安全編程:內(nèi)核下文件讀寫(xiě)函數(shù)
URL地址:http://www.5511xx.com/article/dhgdecj.html