• <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>
            posts - 23,  comments - 20,  trackbacks - 0
            驅(qū)動其實很早以前就寫了  只不過功能沒有達到  加上一直很忙 所以就放下了 今天閑著無聊  就接著寫吧...
            寫完了 發(fā)上來 留著 主要的問題就是效率很低下   不知道為什么有大量的IRP_MJ_DEVICE_CONTROL 這個IRP  CPU全部占滿

            程序很簡單  暴力枚舉 主要是鍛煉一下內(nèi)核編程 以及WinDbg的調(diào)試
            頭文件
             1 /*******************************************************************************
             2 *文件名稱: MyDDK.h 
             3 *作       者:  李佳
             4 *完成日期: 09.7.29
             5 *******************************************************************************/
             6 #pragma once
             7 
             8 #ifdef   __cplusplus
             9 extern "C"
            10 {
            11 #endif
            12 #include <ntddk.h>
            13     //使用RtlStringCchPrintfW
            14 #include <ntstrsafe.h>
            15 #pragma comment(lib , "ntstrsafe.lib")
            16 #ifdef  __cplusplus
            17 }
            18 #endif
            19 
            20 #define PAGEDCODE        code_seg("PAGE")
            21 #define LOCKEDCODE        code_seg()
            22 #define INITCODE            code_seg("INIT")
            23 
            24 #define PAGEDDATA        date_seg("PAGE")
            25 #define LOCKEDDATA        date_seg()
            26 #define INITDATA            date_seg("INIT")
            27 
            28 #define arraysize(p)            (sizeof(p) / sizeof((p)[0]))
            29 
            30 typedef struct _DEVICE_EXTENSION
            31 {
            32     PDEVICE_OBJECT pDevice;
            33     UNICODE_STRING ustrDeviceName;        //設(shè)備名稱
            34     UNICODE_STRING ustrSysLinkName;        //鏈接名稱
            35 }DEVICE_EXTENSION , *PDEVICE_EXTENSION;
            36 
            37 //函數(shù)聲明
            38 //創(chuàng)建設(shè)備
            39 NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
            40 //卸載例程
            41 VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
            42 //默認IRP處理例程
            43 NTSTATUS HelloDDKDispatchRoutine(    IN PDEVICE_OBJECT pDeviceObject ,
            44                                                 IN PIRP Irp);
            45 //綁定所有COM端口
            46 VOID AttachAllComs(PDRIVER_OBJECT Driver);
            47 //打開COM端口
            48 PDEVICE_OBJECT OpenCom(ULONG id , NTSTATUS * status);
            49 //綁定COM口
            50 NTSTATUS AttachDevice(    PDRIVER_OBJECT pDriver , 
            51                                 PDEVICE_OBJECT pOldDeviceObj ,
            52                                 PDEVICE_OBJECT * pNewDeviceObj ,
            53                                 PDEVICE_OBJECT* pNext);

            實現(xiàn)文件
              1 /*****************************************************************************
              2 *文件名稱: MyDDK.cpp
              3 *作        者: 李佳
              4 *完成日期: 09.7.29
              5 ****************************************************************************/
              6 #include "MyDDK.h"
              7 
              8 #define  MAX_COM_NUM 32        //最大COM數(shù)
              9 static PDEVICE_OBJECT fltDevObj[MAX_COM_NUM] = {0};    //過濾設(shè)備的指針
             10 static PDEVICE_OBJECT realDevObj[MAX_COM_NUM] = {0};    //真實設(shè)備的指針
             11 /***************************************************************************
             12 *函數(shù)名稱: DriverEntry
             13 *功能描述: 驅(qū)動程序的入口函數(shù)
             14 *參數(shù)列表: pDriverObject : I/O管理器中傳遞進來的驅(qū)動對象
             15 *             pRegistryPath : 驅(qū)動程序在注冊表中的存儲路徑
             16 *返  回  值: 返回初始化驅(qū)動的執(zhí)行狀態(tài)
             17 **************************************************************************/
             18 #pragma INITCODE
             19 extern "C" DriverEntry(IN PDRIVER_OBJECT pDriverObject , 
             20                  IN PUNICODE_STRING pRegistryPath)
             21 {
             22     NTSTATUS status;
             23     KdPrint(("Enter DriverEntry!\n"));
             24     size_t i = 0;
             25     for (i = 0 ; i < IRP_MJ_MAXIMUM_FUNCTION ; i++)
             26     {
             27         pDriverObject->MajorFunction[i] = HelloDDKDispatchRoutine;
             28     }
             29     pDriverObject->DriverUnload = HelloDDKUnload;    //卸載例程入口
             30     /*pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
             31     pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
             32     pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
             33     pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
             34 
             35     status = CreateDevice(pDriverObject);*/
             36     AttachAllComs(pDriverObject);    //綁定COM 
             37     KdPrint(("Leave DriverEntry!\n"));
             38     return STATUS_SUCCESS;
             39 }
             40 
             41 /***************************************************************************
             42 *函數(shù)名稱: HelloDDKUnload
             43 *功能描述: 負責(zé)卸載驅(qū)動
             44 *參數(shù)列表: pDriverObject : I/O管理器中傳遞進來的驅(qū)動對象
             45 *返  回  值: 返回函數(shù)執(zhí)行結(jié)果
             46 **************************************************************************/
             47 #pragma  PAGEDCODE
             48 VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
             49 {
             50     ULONG i = 0 ;
             51     LARGE_INTEGER intervel;
             52 
             53     //解除設(shè)備鎖定
             54     for (i = 0 ; i < MAX_COM_NUM ; i++)
             55     {
             56         if (realDevObj[i] != NULL)
             57             IoDetachDevice(realDevObj[i]);        
             58     }
             59 
             60     //等待所有IRP完成
             61 #define DELAY_ONE_MICROSECOND (-10)
             62 #define DELAY_ONE_MILLSECOND (DELAY_ONE_MICROSECOND*1000)
             63 #define DELAY_ONE_SECOND (DELAY_ONE_MILLSECOND * 1000)
             64     intervel.QuadPart = (5 * 1000 * DELAY_ONE_MILLSECOND);
             65     KeDelayExecutionThread(KernelMode , FALSE , &intervel);
             66 
             67     //刪除設(shè)備
             68     for (i = 0 ; i < MAX_COM_NUM ; i ++)
             69     {
             70         if(fltDevObj[i] != NULL)
             71             IoDetachDevice(fltDevObj[i]);
             72     }
             73 }
             74 
             75 
             76 /***************************************************************************
             77 *函數(shù)名稱: HelloDDKDispatchRoutine
             78 *功能描述: 默認IRP處理例程
             79 *參數(shù)列表: pDeviceObject : I/O管理器傳遞進來的設(shè)備對象
             80 *             Irp : I/O請求包
             81 *返  回  值: 返回IRP的處理結(jié)果
             82 **************************************************************************/
             83 #pragma  PAGEDCODE
             84 NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDeviceObject , IN PIRP Irp)
             85 {
             86     //KdPrint(("Enter HelloDDKDispatchRoutine!\n"));
             87     NTSTATUS status = STATUS_SUCCESS;
             88     PIO_STACK_LOCATION Irpsp = IoGetCurrentIrpStackLocation(Irp);
             89     ULONG i = 0 , j = 0;
             90     for (i = 0 ; i < MAX_COM_NUM ; i++)
             91     {
             92         if (fltDevObj[i] == pDeviceObject)
             93         {
             94             //電源操作 直接放過
             95             if (Irpsp->MajorFunction  == IRP_MJ_POWER)
             96             {
             97                 PoStartNextPowerIrp(Irp);
             98                 IoSkipCurrentIrpStackLocation(Irp);
             99                 return PoCallDriver(realDevObj[i] , Irp);    //調(diào)用真實設(shè)備
            100             }
            101             //過濾寫請求
            102             if (Irpsp->MajorFunction == IRP_MJ_WRITE)
            103             {
            104                 ULONG uLen = Irpsp->Parameters.Write.Length;    //獲取寫入的長度
            105                 PUCHAR pBuf = NULL;
            106                 if (Irp->MdlAddress != NULL)
            107                     pBuf = (PUCHAR)MmGetSystemAddressForMdlSafe (Irp->MdlAddress , NormalPagePriority);
            108                 else
            109                     pBuf = (PUCHAR)Irp->UserBuffer;
            110                 if(pBuf == NULL)
            111                     pBuf = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
            112 
            113                 for (j = 0 ; j < uLen ; j++)
            114                     KdPrint(("comcap : SendData : %2x\r\n" , pBuf[j]));                
            115             }
            116 
            117         }
            118     }
            119     //找不到這個設(shè)備
            120     Irp->IoStatus.Status = status;
            121     Irp->IoStatus.Information = 0;
            122     IoCompleteRequest(Irp , IO_NO_INCREMENT);
            123     return STATUS_SUCCESS;
            124 }
            125 
            126 /***************************************************************************
            127 *函數(shù)名稱: AttachAllComs
            128 *功能描述: 綁定所有串口設(shè)備
            129 *參數(shù)列表: pDriverObject : I/O管理器中傳遞進來的驅(qū)動對象
            130 *返  回  值: 無
            131 **************************************************************************/
            132 #pragma PAGEDCODE
            133 VOID AttachAllComs(PDRIVER_OBJECT Driver)
            134 {
            135     ULONG i;
            136     PDEVICE_OBJECT pComDev;
            137     NTSTATUS status;
            138     for (i = 0 ; i < MAX_COM_NUM ; i++)
            139     {
            140         pComDev = OpenCom(i , &status);
            141         if (pComDev == NULL)
            142             continue;
            143         AttachDevice(Driver , pComDev , &fltDevObj[i] , &realDevObj[i]);
            144     }
            145 }
            146 
            147 /***************************************************************************
            148 *函數(shù)名稱: OpenCom
            149 *功能描述: 綁定所有串口設(shè)備
            150 *參數(shù)列表: id : 需要綁定的COM號
            151 *             status : 返回函數(shù)的執(zhí)行狀態(tài)
            152 *返  回  值: 返回打開的COM口的設(shè)備對象
            153 **************************************************************************/
            154 #pragma  PAGEDCODE
            155 PDEVICE_OBJECT OpenCom(ULONG id , NTSTATUS * status)
            156 {
            157     UNICODE_STRING ustrDevName ;
            158     WCHAR wName[32];
            159     PFILE_OBJECT pFileObj;
            160     PDEVICE_OBJECT pDevObj;
            161     memset(wName , 0 , sizeof(WCHAR)*32);
            162     RtlStringCchPrintfW(wName , 32 , L"\\Device\\Serial%d" , id);
            163     RtlInitUnicodeString(&ustrDevName , wName);
            164 
            165     //打開設(shè)備
            166     *status = IoGetDeviceObjectPointer(&ustrDevName , FILE_ALL_ACCESS ,&pFileObj , &pDevObj);
            167     if (*status == STATUS_SUCCESS)
            168         ObDereferenceObject(pFileObj);        //解除文件對象
            169 
            170     return pDevObj;
            171 }
            172 
            173 /***************************************************************************
            174 *函數(shù)名稱: AttachDevice
            175 *功能描述: 生成虛擬設(shè)備綁定COM口
            176 *參數(shù)列表: pDriver : I/O管理器中傳遞進來的驅(qū)動對象
            177 *             pOldDeviceObj : 真實設(shè)備的設(shè)備對象
            178 *             pNewDeviceObj : 創(chuàng)建的虛擬設(shè)備的設(shè)備對象
            179 *             pNext : 指向下一個設(shè)備
            180 *返  回  值: 返回創(chuàng)建設(shè)備對象的執(zhí)行結(jié)果
            181 **************************************************************************/
            182 #pragma  PAGEDCODE
            183 NTSTATUS AttachDevice(        PDRIVER_OBJECT pDriver , 
            184                 PDEVICE_OBJECT pOldDeviceObj , 
            185                 PDEVICE_OBJECT * pNewDeviceObj , 
            186                 PDEVICE_OBJECT * pNext)
            187 {
            188     NTSTATUS status;
            189     PDEVICE_OBJECT pTopDev = NULL;
            190 
            191     //生成設(shè)備
            192     status = IoCreateDevice(    pDriver , 
            193         0 , 
            194         NULL , 
            195         pOldDeviceObj->DeviceType , 
            196         0 , 
            197         FALSE ,
            198         pNewDeviceObj    );
            199     if (status != STATUS_SUCCESS)
            200         return status;
            201 
            202     //拷貝重要標(biāo)志
            203     if(pOldDeviceObj->Flags & DO_BUFFERED_IO)
            204         (*pNewDeviceObj)->Flags |= DO_BUFFERED_IO;
            205     if(pOldDeviceObj->Flags & DO_DIRECT_IO)
            206         (*pNewDeviceObj)->Flags |= DO_DIRECT_IO;
            207     if(pOldDeviceObj->Characteristics & FILE_DEVICE_SECURE_OPEN)
            208         (*pNewDeviceObj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
            209     (*pNewDeviceObj)->Flags |= DO_POWER_PAGABLE;
            210 
            211     pTopDev = IoAttachDeviceToDeviceStack(*pNewDeviceObj , pOldDeviceObj);
            212     if (pTopDev == NULL)
            213     {
            214         //綁定失敗
            215         IoDeleteDevice(*pNewDeviceObj);
            216         *pNewDeviceObj = NULL;
            217         return STATUS_UNSUCCESSFUL;
            218     }
            219     *pNext = pTopDev;
            220     //啟動設(shè)備
            221     (*pNewDeviceObj)->Flags = (*pNewDeviceObj)->Flags & ~DO_DEVICE_INITIALIZING;
            222     return STATUS_SUCCESS;
            223 }
            224 
            225 /***************************************************************************
            226 *函數(shù)名稱: CreateDevice
            227 *功能描述: 創(chuàng)建設(shè)備對象
            228 *參數(shù)列表: pDriverObject : I/O管理器中傳遞進來的驅(qū)動對象
            229 *返  回  值: 返回創(chuàng)建設(shè)備對象的執(zhí)行結(jié)果
            230 **************************************************************************/
            231 #pragma INITCODE
            232 NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject)
            233 {
            234     NTSTATUS status;
            235     PDEVICE_OBJECT pDeviceObject;
            236     PDEVICE_EXTENSION pDeviceExtension;
            237 
            238     //設(shè)備名稱
            239     UNICODE_STRING ustrDeviceName;
            240     RtlInitUnicodeString(&ustrDeviceName , L"\\Device\\MyDDKDevice");
            241 
            242     //創(chuàng)建設(shè)備
            243     status = IoCreateDevice(pDriverObject , 
            244         sizeof(DEVICE_EXTENSION),
            245         &ustrDeviceName , 
            246         FILE_DEVICE_UNKNOWN , 
            247         0,
            248         TRUE,
            249         &pDeviceObject/*注意此處為OUT PDEVICE_OBJECT  *DeviceObject*/);    
            250     if (!NT_SUCCESS(status))
            251         return status;
            252 
            253     pDeviceObject->Flags |= DO_BUFFERED_IO;
            254     pDeviceExtension = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;    //填充DeviceObject的DeviceExtension字段的內(nèi)容 便于以后使用
            255     pDeviceExtension->pDevice = pDeviceObject;
            256     pDeviceExtension->ustrDeviceName = ustrDeviceName;
            257 
            258     //創(chuàng)建符號鏈接
            259     UNICODE_STRING ustrSysLinkName;
            260     RtlInitUnicodeString(&ustrSysLinkName , L"\\??\\MyDDK");
            261     pDeviceExtension->ustrSysLinkName = ustrSysLinkName;
            262     status = IoCreateSymbolicLink(&ustrSysLinkName,&ustrDeviceName);
            263     if (!NT_SUCCESS(status))
            264     {
            265         IoDeleteDevice(pDeviceObject);
            266         return status;
            267     }
            268     return STATUS_SUCCESS;
            269 }
            270 

            效率方面  接下來再考慮如何提高
            還是那句話  Make it right before you make it faster!

            posted on 2009-08-28 16:20 李佳 閱讀(1525) 評論(0)  編輯 收藏 引用 所屬分類: 驅(qū)動開發(fā)

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2009年11月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久99精品国产| 91性高湖久久久久| 伊人久久大香线蕉综合影院首页| 久久久久女教师免费一区| 一本大道久久东京热无码AV| 久久天天躁夜夜躁狠狠| 国产Av激情久久无码天堂| 久久r热这里有精品视频| 久久99久久无码毛片一区二区| 久久午夜免费视频| 国产一区二区精品久久| 污污内射久久一区二区欧美日韩| 亚洲精品国精品久久99热| 久久99国产综合精品女同| 国产精品久久久久乳精品爆| 精品久久久无码21p发布 | 久久综合视频网站| 久久久久久亚洲精品成人 | 色综合久久久久综合体桃花网| 99久久无色码中文字幕| 久久国产免费直播| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产精品久久99| 思思久久99热只有频精品66| 91精品免费久久久久久久久| 久久亚洲美女精品国产精品| 一本久久综合亚洲鲁鲁五月天| 国内精品久久久久久久coent| 久久婷婷五月综合97色一本一本| 久久无码一区二区三区少妇| 亚洲综合久久综合激情久久| 久久精品aⅴ无码中文字字幕重口| 久久人人青草97香蕉| 欧美国产成人久久精品| 91精品久久久久久无码| 久久最新精品国产| 久久ww精品w免费人成| 久久综合给久久狠狠97色| 亚洲综合伊人久久综合| 热99RE久久精品这里都是精品免费| 日韩影院久久|