青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

aurain
技術文摘
posts - 137,  comments - 268,  trackbacks - 0

一. 在驅動中使用文件

Windows執(zhí)行體中,通過文件對象來代表文件,該文件對象是一種由對象管理器管理的執(zhí)行體對象。例如:目錄也是由文件對象代表的。

內核組件通過對象名來引用文件,即在文件的全路徑前面加\DosDevices。(在Windows 2000及后續(xù)操作系統(tǒng)中,\??等同于\DosDevices)。例如,文件C:\WINDOWS\example.txt的對象名為\DosDevices\C:\WINDOWS\example.txt。你需要用對象名來打開文件以獲取句柄。

對象名在下面會講述。

使用文件步驟:

  1. 打開文件返回文件句柄。
  2. 調用合適的ZwXxxFile 函數(shù)以完成對文件的操作。
  3. 調用ZwClose函數(shù)關閉打開的文件句柄。

當打開一個指向文件的文件句柄時,Windows執(zhí)行體就創(chuàng)建了一個文件對象來代表該文件,同時返回一個代表該對象的文件句柄。因此,對于單個文件來說,會存在多個文件對象的情況。同樣,由于用戶模式的應用程序可能會復制文件句柄,因此,對于同一個文件對象,也會存在多個文件句柄。只有當所有指向一個文件對象的文件句柄都關閉后,Windows執(zhí)行體才會刪除該文件對象。

二. 對象名

內核模式的對象可以是具名的或者是無名的。對象名是一個Unicode字符串,不管是用戶模式還是內核模式,都可以額用它來引用對象。例如,\KernelObjects\LowMemoryCondition是一個指示在系統(tǒng)中總的可用內存偏低的標準事件對象名稱。

用戶模式和內核模式都利用對象名來打開指向對象的句柄。所有的后續(xù)操作都需要用該打開的句柄來完成。

如果對象是無名的,用戶模式的組件無法打開指向該對象的句柄。內核模式則不同,它可以通過指針或句柄來引用無名對象。

具名對象被組織成層狀結構。每個對象的命名同其父對象有關系。每個組件的對象名以反斜杠開頭。例如,\KernelObjects對象是\KernelObjects\LowMemoryCondition對象的父對象。

    只有某些類型的對象才擁有子對象。下面列出其中的一部分:

1. 目錄對象。對象管理器利用目錄對象管理對象,例如,\KernelObjects是一個目錄對象,它用來維護標準事件對象。目錄對象不與真實的磁盤目錄相對應。這里,目錄的意思不是普通我們講的文件夾目錄的意思。

2. 磁盤驅動設備對象。這與磁盤文件(含常規(guī)目錄)相對應。

3. 代表目錄的文件對象。對應指定目錄下的所有文件,此處的目錄同常規(guī)理解的目錄相同。

4. WDM驅動設備對象,具有自己的命名空間,可以用在驅動定義的方式中。

    文件具有對象名,其命名與\DosDevices有關。例如,文件C:\Directory\File的對象名為\DosDevices\C:\Directory\File

下表描述了一組典型的對象名

對象名

描述

\DosDevices

對象目錄

\DosDevices\C:

代表C盤的設備對象

\DosDevices\C:\Directory

代表名為C:\Director的文件對象

\DosDevices\C:\Directory\File

代表名為C:\Directo\Filer的文件對象

驅動可以在指定的對象目錄中創(chuàng)建具名對象

三. 打開指向文件的句柄

按如下步驟來打開指向文件的句柄:

1. 定義各一個OBJECT_ATTRIBUTES結構體變量,然后調用InitializeObjectAttributes函數(shù)初始化該變量。關鍵是設置改變量的ObjectName字段為文件對象名。

2. 調用IoCreateFile, ZwCreateFile, 或者 ZwOpenFile,傳遞上面定義的結構體變量,成功就會返回執(zhí)行該文件的句柄。

注:驅動一般用ZwCreateFileZwOpenFileIoCreateFile很少使用

    當調用ZwCreateFileZwOpenFileIoCreateFile時,Windows執(zhí)行體創(chuàng)建一個代表該文件的新的文件對象,并返回一個指向該對象的句柄。文件對象一直存在,知道你關閉了所有指向它的文件句柄。

四. 使用文件句柄操作文件

    下表列出了驅動中常用的利用文件句柄操作文件的函數(shù)

操作

函數(shù)

讀文件

ZwReadFile

寫文件

ZwWriteFile

讀文件熟悉

ZwQueryInformationFile

設置文件熟悉

ZwSetInformationFile

 

五. 驅動中使用文件代碼示例

 

/** @file 
*Copyright(C):     Information Technology Co Ltd., All rights reserved.
*@n
*@n 文件:            MyKFile.h
*@n 功能:            處理內核文件的操作
*@n 作者:            aurain(zhangqiushui@gmail.com) 2009-12-31
*/

#ifndef __MYKFILE_H__
#define __MYKFILE_H__

#include 
"debug.h"

/**
* 創(chuàng)建或打開文件
* @param lpFileHandle 返回打開的文件句柄指針
* @param usFileName 需要打開的文件路徑,使用對象路徑,如\\??\\c:\test.txt
* @param dwDesiredAccess 申請權限,可以用|(或)組合以下操作
寫文件內容-FILE_WRITE_DATA,設置文件熟悉-FILE_WRITE_ATTRIBUTES,通用寫-GENERIC_WRITE
讀文件內容-FILE_READ_DATA,設置文件熟悉-FILE_READE_ATTRIBUTES,通用寫-GENERIC_READ
刪除文件-DELETE
全部權限-GENERIC_ALL
同步打開文件-SYNCHRONIZE
* @param dwShareAccess 共享方式(是指本代碼打開這個文件時,允許別的代碼同時打開這個文件所具有的權限
可以用|(或)組合以下操作
共享讀-FILE_SHARE_READ
共享寫-FILE_SHARE_WRITE
共享刪除-FILE_SHARE_DELETE
* @param dwCreateDisposition 創(chuàng)建或打開文件的目的
新建文件-FILE_CREATE
打開文件-FILE_OPEN
打開或新建-FILE_OPEN_IF
覆蓋-FILE_OVERWRITE
新建或覆蓋-FILE_OVERWRITE_IF
新建或取代-FILE_SUPERSEDE
* @param dwCreateOptions 打開文件時選項設置
一般用FILE_NOT_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
* @return 讀取成功: STATUS_SUCCESS;讀取失敗:NTSTATUS error code
*/

__inline
NTSTATUS MyCreateFile(OUT PHANDLE lpFileHandle,
                      IN PUNICODE_STRING usFileName,
                      IN ULONG dwDesiredAccess,
                      IN ULONG dwShareAccess,
                      IN ULONG dwCreateDisposition,
                      IN ULONG dwCreateOptions)
{
    NTSTATUS ntStatus 
= STATUS_UNSUCCESSFUL;
    OBJECT_ATTRIBUTES oaName;
    IO_STATUS_BLOCK iosBlock;
    
if (lpFileHandle != NULL && usFileName != NULL && usFileName->Buffer != NULL)
    
{
        
if (PASSIVE_LEVEL != KeGetCurrentIrql()) 
        
{
            
return ntStatus;
        }

        InitializeObjectAttributes(
&oaName,
            usFileName,
            OBJ_CASE_INSENSITIVE 
| OBJ_KERNEL_HANDLE,
            NULL,
            NULL);
        ntStatus 
= ZwCreateFile(lpFileHandle,
            dwDesiredAccess,
            
&oaName,
            
&iosBlock,
            NULL,
            FILE_ATTRIBUTE_NORMAL,
            dwShareAccess,
            dwCreateDisposition,
            dwCreateOptions,
            NULL,
            
0);
        
if (!NT_SUCCESS(ntStatus))
        
{    
            DEBUG_ERROR((
"[MyCreateFile]ZwCreateFile(%ws)failed with error:%08x\r\n", usFileName->Buffer, ntStatus));    
            
return ntStatus;
        }

    }

    
return ntStatus;
}


/**
* 關閉打開的文件句柄
* @param hFile 文件句柄
* @return 讀取成功: STATUS_SUCCESS;讀取失敗:NTSTATUS error code
*/

__inline
NTSTATUS MyCloseFile(IN HANDLE hFile)
{
    
return ZwClose(hFile);
}


/**
* 讀取文件內容
* @param hFile 文件句柄
* @param pBuffer 緩沖區(qū)
* @param ulBufferSize 緩沖區(qū)大小
* @param pulBytesRead 實際讀取的大小
* @return 讀取成功: STATUS_SUCCESS;讀取失敗:NTSTATUS error code
*/

__inline
NTSTATUS MyReadFile(IN HANDLE hFile,
                    IN PVOID pBuffer,
                    IN ULONG ulBufferSize,
                    OUT PULONG pulBytesRead)
{
    IO_STATUS_BLOCK    iosBlock;
    NTSTATUS        ntStatus 
= STATUS_UNSUCCESSFUL;

    
if (hFile == NULL || pBuffer == NULL)
    
{
        
return ntStatus;
    }

    
if( PASSIVE_LEVEL < KeGetCurrentIrql())
    
{    
        DEBUG_ERROR((
"All kernel file operating functions must running on PASSIVE_LEVEL\r\n"));

        
return ntStatus;
    }


    
*pulBytesRead = 0;

    ntStatus 
= ZwReadFile(hFile,
        NULL,
        NULL,
        NULL,
        
&iosBlock,
        pBuffer,
        ulBufferSize,
        NULL,
        NULL);

    
if (NT_SUCCESS(ntStatus))
    
{
        
//獲取實際讀取到的大小
        *pulBytesRead = (ULONG)iosBlock.Information;
    }

    
else
    
{
        DEBUG_ERROR((
"[MyReadFile]ZwReadFile failed with:%08x\r\n", ntStatus));
    }


    
return ntStatus;
}


/**
* 向文件寫入內容
* @param hFile 文件句柄
* @param pBuffer 緩沖區(qū)
* @param ulBufferSize 緩沖區(qū)大小
* @param pulBytesWrite 實際寫入的大小
* @return 讀取成功: STATUS_SUCCESS;讀取失敗:NTSTATUS error code
*/

__inline
NTSTATUS MyWriteFile(IN HANDLE hFile,
                     IN PVOID pBuffer,
                     IN ULONG ulBufferSize,
                     OUT PULONG pulBytesWrite)
{
    IO_STATUS_BLOCK    iosBlock;
    NTSTATUS        ntStatus 
= STATUS_UNSUCCESSFUL;
    
    
if (hFile == NULL || pBuffer == NULL)
    
{
        
return ntStatus;
    }


    
// All kernel file operating functions must running on PASSIVE_LEVEL
    if (PASSIVE_LEVEL !=  KeGetCurrentIrql()) 
    
{
        
return ntStatus;
    }


    
*pulBytesWrite = 0;

    ntStatus 
= ZwWriteFile(hFile,
        NULL,
        NULL,
        NULL,
        
&iosBlock,
        pBuffer,
        ulBufferSize,
        NULL,
        NULL);

    
if (NT_SUCCESS(ntStatus))
    
{
        
*pulBytesWrite = (ULONG)iosBlock.Information;
    }

    
else
    
{
        DEBUG_ERROR((
"[MyWriteFile]ZwWriteFile failed with:%08x\r\n", ntStatus));
    }


    
return ntStatus;
}


#endif

 

posted on 2009-12-31 15:27 閱讀(10362) 評論(1)  編輯 收藏 引用 所屬分類: windows驅動

FeedBack:
# re: Windows內核驅動中操作文件
2009-12-31 21:24 | 淘寶皇冠店100強
馬上到你們三大名  回復  更多評論
  

<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網(wǎng)絡開發(fā)

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 502446
  • 排名 - 37

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产日韩一区二区三区| 国内久久视频| 亚洲在线成人| 久久夜色精品亚洲噜噜国产mv | 国产在线乱码一区二区三区| 久久成人精品| 亚洲国产专区校园欧美| 一本色道久久88综合日韩精品| 国产精品白丝jk黑袜喷水| 午夜激情综合网| 欧美.日韩.国产.一区.二区| 99国产麻豆精品| 国产欧美精品一区二区三区介绍| 久久久国产精品一区二区中文| 亚洲欧洲视频| 久久黄色小说| 最新国产成人av网站网址麻豆 | 国产日韩欧美精品| 毛片基地黄久久久久久天堂| 一区二区三区久久网| 久久久福利视频| 99视频一区二区| 国产视频久久久久久久| 欧美国产日本韩| 欧美一级在线视频| 亚洲精品美女在线| 久久久久久999| 一区二区三区四区国产精品| 黄色成人91| 国产精品99免视看9| 久久综合伊人77777| 午夜欧美电影在线观看| 亚洲国产日韩欧美在线99| 久久成人精品无人区| aa国产精品| 曰韩精品一区二区| 国产精品网站视频| 欧美啪啪一区| 久久久久综合一区二区三区| 亚洲视频观看| 亚洲精品免费看| 欧美成人在线免费观看| 久久高清免费观看| 亚洲永久免费| 99人久久精品视频最新地址| 激情欧美一区二区| 国产伦精品一区二区三区照片91| 欧美激情一二三区| 免费不卡视频| 久久亚洲精品网站| 久久精品免费播放| 午夜精品免费| 亚洲自拍都市欧美小说| 一区二区三区久久久| 亚洲高清不卡在线观看| 久久综合电影| 久久综合网络一区二区| 久久精品国产成人| 欧美中文字幕精品| 亚洲欧美日韩国产中文在线| 一区二区三区四区五区视频| 日韩午夜在线视频| 亚洲美女视频网| 亚洲日韩中文字幕在线播放| 在线观看一区| 在线观看日产精品| 亚洲国产成人精品女人久久久 | 中文高清一区| 夜夜嗨av一区二区三区中文字幕 | 久久网站免费| 久久中文在线| 欧美99在线视频观看| 美女免费视频一区| 欧美成年人视频| 欧美freesex8一10精品| 欧美sm极限捆绑bd| 亚洲电影视频在线| 亚洲第一天堂无码专区| 欧美顶级艳妇交换群宴| 亚洲国产99精品国自产| 亚洲国产欧美日韩精品| 日韩午夜剧场| 一区二区电影免费观看| 亚洲愉拍自拍另类高清精品| 午夜精品久久久久久久99水蜜桃| 欧美一区国产在线| 久久一区二区三区四区五区| 欧美不卡视频| 国产精品99免视看9| 国产色爱av资源综合区| 在线观看成人网| 亚洲精品视频在线观看网站| 亚洲伊人伊色伊影伊综合网| 欧美在线精品一区| 欧美1区视频| 日韩手机在线导航| 亚洲欧美视频在线观看| 久久青草欧美一区二区三区| 欧美国产1区2区| 国产精品视频在线观看| 一区二区在线观看视频| 99xxxx成人网| 久久9热精品视频| 美女尤物久久精品| 99天天综合性| 久久国产精品高清| 欧美精品一卡二卡| 国产一区二区精品| 亚洲乱码日产精品bd| 欧美一区二区三区免费观看| 蜜桃精品一区二区三区| 99精品国产高清一区二区| 欧美一区二区三区精品| 欧美国产精品中文字幕| 国产日本欧美一区二区三区| 亚洲精品国产视频| 欧美与黑人午夜性猛交久久久| 欧美激情 亚洲a∨综合| 亚洲欧美日韩国产精品| 模特精品在线| 国产一区视频在线看| 一区二区三区高清| 欧美11—12娇小xxxx| 亚洲女ⅴideoshd黑人| 欧美高清在线一区| 激情视频一区二区| 午夜亚洲精品| 亚洲精品日产精品乱码不卡| 久久精品欧美日韩| 国产精品婷婷| 一区二区三区成人| 欧美国产在线观看| 久久国产婷婷国产香蕉| 国产精品家庭影院| 99视频精品在线| 欧美激情亚洲自拍| 欧美综合二区| 国产美女搞久久| 亚洲少妇在线| 亚洲二区精品| 久久久一本精品99久久精品66| 国产麻豆一精品一av一免费| 中文欧美日韩| 亚洲精品自在久久| 欧美成人免费播放| 亚洲国产欧美日韩| 欧美成人免费观看| 久久婷婷影院| 亚洲高清在线| 暖暖成人免费视频| 久久久亚洲国产天美传媒修理工| 国产一区av在线| 久久国产精品久久w女人spa| 亚洲一区尤物| 国产精品一二三四区| 先锋影音网一区二区| 一区二区三区欧美在线| 欧美三级在线播放| 亚洲一区二区精品在线| 99视频一区二区三区| 欧美日韩一卡二卡| 亚洲性视频网址| 中文久久精品| 国产欧美一区二区精品性色| 欧美在线播放一区| 亚欧美中日韩视频| 狠狠色综合网站久久久久久久| 久久香蕉精品| 美女尤物久久精品| 日韩视频在线永久播放| 日韩午夜精品| 国产精品国产三级欧美二区| 午夜精品在线视频| 欧美一区二区三区免费观看| 黑人极品videos精品欧美裸| 欧美成人国产va精品日本一级| 免费在线亚洲欧美| 一本色道精品久久一区二区三区 | 有坂深雪在线一区| 欧美大片国产精品| 欧美精品高清视频| 亚洲欧美综合v| 久久国产福利| 亚洲经典自拍| 日韩一级不卡| 国产偷国产偷精品高清尤物| 美女黄网久久| 欧美日韩国产成人在线| 欧美亚洲网站| 久久中文欧美| 亚洲一卡久久| 久久久青草青青国产亚洲免观| 亚洲三级视频| 亚洲综合成人婷婷小说| 在线欧美日韩| 一区二区三区久久久| 黑人一区二区| 亚洲免费观看视频| 国内精品久久久久久久果冻传媒| 91久久国产精品91久久性色|