我的第一个驱动程序

来源:互联网 发布:天津天水淘宝城怎么样 编辑:程序博客网 时间:2024/04/25 19:11

//////////////////////////
//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