我的第一个驱动程序
来源:互联网 发布:天津天水淘宝城怎么样 编辑:程序博客网 时间: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
- 我的第一个驱动程序
- 我的第一个驱动程序
- 我的第一个驱动程序
- 我的第一个uClinux驱动程序
- 我的第一个Winxp sp2驱动程序(hello world)
- Tiny6410 我的第一个嵌入式linux驱动程序模块
- Tiny6410 我的第一个嵌入式Linux驱动程序模块
- 我的第一个字符设备驱动程序-First_drv
- 我的第一个Linux开发板字符驱动程序
- 驱动程序开发学习之旅(1):我的第一个驱动程序
- 我的第一个
- 我的第一个
- 第二章 第二节 Linux设备驱动程序之--我的第一个程序 Hello World
- <ARM嵌入式开发学习>我的第一个驱动程序-hello world
- 【Linux】我的第一个驱动程序——scull字符设备驱动
- 写第一个驱动程序的总结
- 第一个LINUX下的驱动程序
- 第一个嵌入式Linux的驱动程序
- 《WCF技术内幕》翻译37:第2部分_第7章_通道管理器:概述和通道管理器的概念
- 《WCF技术内幕》翻译36:第2部分_第6章_通道:创建自定义通道和本章小结
- 《WCF技术内幕》翻译35:第2部分_第6章_通道:通道功能
- 《WCF技术内幕》翻译34:第2部分_第6章_通道:通道接口和基本类型
- 《WCF技术内幕》翻译33:第2部分_第6章_通道:通道形状
- 我的第一个驱动程序
- Ruby 101:行为驱动
- jQuery ajax upload image
- 月底总结
- 新建文章1
- 离别的感伤
- 人机交互接口的安全性设计
- Socket介绍
- 【译文】理解ASP.NET 2.0中的单点登录