我的第一个驱动程序

//
//HelloDDK.C
//

#include <NTDDK.h>
#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")

typedef struct DEVICE_EXTENSION
{
 PDEVICE_OBJECT pDevice;
 UNICODE_STRING ustrDeviceName;
 UNICODE_STRING ustrSymLinkName;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;

VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);

#pragma INITCODE
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
      IN PUNICODE_STRING pRegistryPath)
{
 NTSTATUS status;

 KdPrint(("IN DriverEntry/n"));

 pDriverObject->DriverUnload = HelloDDKUnload;
 pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
 pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
 pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
 pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;

    status = CreateDevice(pDriverObject);

 KdPrint(("OUT DriverEntry/n"));

 return status;
}

#pragma INITCODE
NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject)
{
 NTSTATUS status;
 PDEVICE_OBJECT pDevObj;
 PDEVICE_EXTENSION pDevExt;
 UNICODE_STRING devName;
 UNICODE_STRING SymLinkName;
 
 KdPrint(("IN CreateDevice/n"));
 
 RtlInitUnicodeString(&devName, L"//Device//MyDDKDevice");
 status = IoCreateDevice(pDriverObject,
  sizeof(DEVICE_EXTENSION),
  &devName,
  FILE_DEVICE_UNKNOWN,
  0, TRUE,
  &pDevObj);
 if(!NT_SUCCESS(status))
 {
  KdPrint(("CreateDevice FAIL/n"));
  return status;
 }
 
 pDevObj->Flags |= DO_BUFFERED_IO;
 pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
 pDevExt->pDevice = pDevObj;
 pDevExt->ustrDeviceName = devName;
 
 RtlInitUnicodeString(&SymLinkName, L"//??//HelloDDK");
 pDevExt->ustrSymLinkName = SymLinkName;
 status = IoCreateSymbolicLink(&SymLinkName, &devName);
 if(!NT_SUCCESS(status))
 {
  IoDeleteDevice(pDevObj);
  KdPrint(("CreateDevice FAIL/n"));
  return status;
 }
 
 KdPrint(("CreateDevice SUCCESS/n"));
 return STATUS_SUCCESS;
}

#pragma PAGEDCODE
VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
{
 PDEVICE_OBJECT pNextObj;
 PDEVICE_EXTENSION pDevExt;
 UNICODE_STRING pLinkName;

 KdPrint(("HelloDDKUnload/n"));
 pNextObj = pDriverObject->DeviceObject;
 while(pNextObj != NULL)
 {
  pDevExt = (PDEVICE_EXTENSION)
   pNextObj->DeviceExtension;

  pLinkName = pDevExt->ustrSymLinkName;
  IoDeleteSymbolicLink(&pLinkName);
  pNextObj = pNextObj->NextDevice;
  IoDeleteDevice(pDevExt->pDevice);
 }
}

#pragma  PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
 NTSTATUS status = STATUS_SUCCESS;
 pIrp->IoStatus.Status = status;
 pIrp->IoStatus.Information = 0;
 IoCompleteRequest(pIrp, IO_NO_INCREMENT);

 KdPrint(("HelloDDKDispatchRoutine/n"));

 return status;
}

 

 

Sources文件:

TARGETNAME=HelloDDK
TARGETTYPE=DRIVER
TARGETPATH=OBJ

SOURCES=HelloDDK.C

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值