Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

NT驱动分析(2)

来源: 未知 分享至:
  34:  * 函数名称:CreateDevice
  35:  * 功能描述:初始化设备对象
  36:  * 参数列表:
  37:        pDriverObject:从I/O管理器中传进来的驱动对象
  38:  * 返回 值:返回初始化状态
  39:  *************************************************************************/
  40:  #pragma INITCODE
  41:  NTSTATUS CreateDevice (
  42:          IN PDRIVER_OBJECT    pDriverObject) 
  43:  {
  44:      NTSTATUS status;
  45:      PDEVICE_OBJECT pDevObj;
  46:      PDEVICE_EXTENSION pDevExt;
  47:      
  48:      //创建设备名称
  49:      UNICODE_STRING devName;
  50:      RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
  51:      
  52:      //创建设备
  53:      status = IoCreateDevice( pDriverObject,
  54:                          sizeof(DEVICE_EXTENSION),
  55:                          &(UNICODE_STRING)devName,
  56:                          FILE_DEVICE_UNKNOWN,
  57:                          0, TRUE,
  58:                          &pDevObj );
  59:      if (!NT_SUCCESS(status))
  60:          return status;
  61:   
  62:      pDevObj->Flags |= DO_BUFFERED_IO;
  63:      pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
  64:      pDevExt->pDevice = pDevObj;
  65:      pDevExt->ustrDeviceName = devName;
  66:      //创建符号链接
  67:      UNICODE_STRING symLinkName;
  68:      RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
  69:      pDevExt->ustrSymLinkName = symLinkName;
  70:      status = IoCreateSymbolicLink( &symLinkName,&devName );
  71:      if (!NT_SUCCESS(status)) 
  72:      {
  73:          IoDeleteDevice( pDevObj );
  74:          return status;
  75:      }
  76:      return STATUS_SUCCESS;
  77:  }
  78:   
  79:  /************************************************************************
  80:  * 函数名称:HelloDDKUnload
  81:  * 功能描述:负责驱动程序的卸载操作
  82:  * 参数列表:
  83:        pDriverObject:驱动对象
  84:  * 返回 值:返回状态
  85:  *************************************************************************/
  86:  #pragma PAGEDCODE
  87:  VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) 
  88:  {
  89:      PDEVICE_OBJECT    pNextObj;
  90:      KdPrint(("Enter DriverUnloadn"));
  91:      pNextObj = pDriverObject->DeviceObject;
  92:      while (pNextObj != NULL) 
  93:      {
  94:          PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
  95:              pNextObj->DeviceExtension;
  96:   
  97:          //删除符号链接
  98:          UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
  99:          IoDeleteSymbolicLink(&pLinkName);
 100:          pNextObj = pNextObj->NextDevice;
 101:          IoDeleteDevice( pDevExt->pDevice );
 102:      }
 103:  }
 104:   
 105:  /************************************************************************
 106:  * 函数名称:HelloDDKDispatchRoutine
 107:  * 功能描述:对读IRP进行处理
 108:  * 参数列表:
 109:        pDevObj:功能设备对象
 110:        pIrp:从IO请求包
 111:  * 返回 值:返回状态
 112:  *************************************************************************/
 113:  #pragma PAGEDCODE
 114:  NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
 115:                                   IN PIRP pIrp) 
 116:  {
 117:      KdPrint(("Enter HelloDDKDispatchRoutinen"));
 118:      NTSTATUS status = STATUS_SUCCESS;
 119:      // 完成IRP
 120:      pIrp->IoStatus.Status = status;
 121:      pIrp->IoStatus.Information = 0;    // bytes xfered
 122:      IoCompleteRequest( pIrp, IO_NO_INCREMENT );
 123:      KdPrint(("Leave HelloDDKDispatchRoutinen"));
 124:      return status;
 125:  }
 
第12行至31行定义了Driver_Entry入口函数。这里的extern "C"显然和前面一个意思,作为被内核直接调用的
函数,必须要使用c语言的方式编译。作为初始化函数,它注册了卸载例程和IRP响应函数,然后创建了一个设
备便结束了。status是由设备是否成功创建为标准的。
 
41至77行定义了CreateDevice函数,首先用RtlInitUnicodeString()函数,初始化了devName(相当于UNICODE
的赋值函数),字符串左端的L代表这是个宽字符集(占1个word)。接下来就调用了该函数的核心
IoCreateDevice()。
接口如下:
NTSTATUS IoCreateDevice(
  __in      PDRIVER_OBJECT DriverObject,
  __in      ULONG DeviceExtensionSize,
  __in_opt  PUNICODE_STRING DeviceName,
  __in      DEVICE_TYPE DeviceType,
  __in      ULONG DeviceCharacteristics,
  __in      BOOLEAN Exclusive,
  __out     PDEVICE_OBJECT *DeviceObject
);
解释两个,
DeviceCharacteristics:用于描述设备某种特征的值,比如这是一个只读设备,这是一个远程设备,等等。
Exclusive: 描述这个设备是否是独占的设备,这个我暂时不太能理解,不过MSDN上面提到,大部分driver都
是false。和该程序有出入。
 
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史