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

            程序很簡單  暴力枚舉 主要是鍛煉一下內核編程 以及WinDbg的調試
            頭文件
             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;        //設備名稱
            34     UNICODE_STRING ustrSysLinkName;        //鏈接名稱
            35 }DEVICE_EXTENSION , *PDEVICE_EXTENSION;
            36 
            37 //函數聲明
            38 //創建設備
            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);

            實現文件
              1 /*****************************************************************************
              2 *文件名稱: MyDDK.cpp
              3 *作        者: 李佳
              4 *完成日期: 09.7.29
              5 ****************************************************************************/
              6 #include "MyDDK.h"
              7 
              8 #define  MAX_COM_NUM 32        //最大COM數
              9 static PDEVICE_OBJECT fltDevObj[MAX_COM_NUM] = {0};    //過濾設備的指針
             10 static PDEVICE_OBJECT realDevObj[MAX_COM_NUM] = {0};    //真實設備的指針
             11 /***************************************************************************
             12 *函數名稱: DriverEntry
             13 *功能描述: 驅動程序的入口函數
             14 *參數列表: pDriverObject : I/O管理器中傳遞進來的驅動對象
             15 *             pRegistryPath : 驅動程序在注冊表中的存儲路徑
             16 *返  回  值: 返回初始化驅動的執行狀態
             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 *函數名稱: HelloDDKUnload
             43 *功能描述: 負責卸載驅動
             44 *參數列表: pDriverObject : I/O管理器中傳遞進來的驅動對象
             45 *返  回  值: 返回函數執行結果
             46 **************************************************************************/
             47 #pragma  PAGEDCODE
             48 VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
             49 {
             50     ULONG i = 0 ;
             51     LARGE_INTEGER intervel;
             52 
             53     //解除設備鎖定
             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     //刪除設備
             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 *函數名稱: HelloDDKDispatchRoutine
             78 *功能描述: 默認IRP處理例程
             79 *參數列表: pDeviceObject : I/O管理器傳遞進來的設備對象
             80 *             Irp : I/O請求包
             81 *返  回  值: 返回IRP的處理結果
             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);    //調用真實設備
            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     //找不到這個設備
            120     Irp->IoStatus.Status = status;
            121     Irp->IoStatus.Information = 0;
            122     IoCompleteRequest(Irp , IO_NO_INCREMENT);
            123     return STATUS_SUCCESS;
            124 }
            125 
            126 /***************************************************************************
            127 *函數名稱: AttachAllComs
            128 *功能描述: 綁定所有串口設備
            129 *參數列表: pDriverObject : I/O管理器中傳遞進來的驅動對象
            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 *函數名稱: OpenCom
            149 *功能描述: 綁定所有串口設備
            150 *參數列表: id : 需要綁定的COM號
            151 *             status : 返回函數的執行狀態
            152 *返  回  值: 返回打開的COM口的設備對象
            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     //打開設備
            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 *函數名稱: AttachDevice
            175 *功能描述: 生成虛擬設備綁定COM口
            176 *參數列表: pDriver : I/O管理器中傳遞進來的驅動對象
            177 *             pOldDeviceObj : 真實設備的設備對象
            178 *             pNewDeviceObj : 創建的虛擬設備的設備對象
            179 *             pNext : 指向下一個設備
            180 *返  回  值: 返回創建設備對象的執行結果
            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     //生成設備
            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     //拷貝重要標志
            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     //啟動設備
            221     (*pNewDeviceObj)->Flags = (*pNewDeviceObj)->Flags & ~DO_DEVICE_INITIALIZING;
            222     return STATUS_SUCCESS;
            223 }
            224 
            225 /***************************************************************************
            226 *函數名稱: CreateDevice
            227 *功能描述: 創建設備對象
            228 *參數列表: pDriverObject : I/O管理器中傳遞進來的驅動對象
            229 *返  回  值: 返回創建設備對象的執行結果
            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     //設備名稱
            239     UNICODE_STRING ustrDeviceName;
            240     RtlInitUnicodeString(&ustrDeviceName , L"\\Device\\MyDDKDevice");
            241 
            242     //創建設備
            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字段的內容 便于以后使用
            255     pDeviceExtension->pDevice = pDeviceObject;
            256     pDeviceExtension->ustrDeviceName = ustrDeviceName;
            257 
            258     //創建符號鏈接
            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 李佳 閱讀(1519) 評論(0)  編輯 收藏 引用 所屬分類: 驅動開發
            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产亚州精品女人久久久久久| 无码人妻久久一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 久久中文精品无码中文字幕| 人人狠狠综合久久亚洲88| 国产99精品久久| 久久精品国产亚洲麻豆| 91精品国产综合久久香蕉 | 久久综合久久美利坚合众国| 日本高清无卡码一区二区久久| 久久久久国产亚洲AV麻豆| 久久久中文字幕日本| 亚洲欧洲精品成人久久曰影片| 伊人久久亚洲综合影院| 亚洲精品乱码久久久久久蜜桃图片| 无码精品久久久久久人妻中字| 欧美一区二区三区久久综合| 国产精品久久久久久福利漫画| 99久久综合狠狠综合久久| 欧美激情精品久久久久久久| 色天使久久综合网天天| 久久国产精品成人影院| 91精品国产色综久久| 亚洲人成网站999久久久综合| 亚洲欧美日韩久久精品第一区| 国产精品久久影院| 亚洲中文字幕伊人久久无码| 亚洲AV乱码久久精品蜜桃| 爱做久久久久久| 一本久道久久综合狠狠爱| 久久九九全国免费| 无码八A片人妻少妇久久| 国产一久久香蕉国产线看观看| 久久久免费观成人影院| 久久丫精品国产亚洲av| 精品久久人人妻人人做精品| 色偷偷久久一区二区三区| 欧美色综合久久久久久| 久久99久久99精品免视看动漫| 午夜精品久久影院蜜桃| 2020最新久久久视精品爱 |