日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ddk开发 c语言,ddk_helloWDM_原代码是网上高手的杰作

發布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ddk开发 c语言,ddk_helloWDM_原代码是网上高手的杰作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果你和我一樣沒有天才的智慧那么漫漫來看看這個ddk_hello..

###########首先感謝這位高手以前的杰作####################

首先這個過程讓你體會到了如何編譯一個簡單的ddk程序,同時在解決了幾個簡單而致命的錯誤之后,你會更有信心深入了解DDK!

C語言是這里的神,所以你的程序中必須要按照C語言的規范:

如:

1/函數聲明后在 具體化它;

2/函數體內的變量必須放在函數體靠前的地方聲明;

首先這是個WDM的hello;

代碼如下:

hello.c

/***************************************************************

程序名稱:Hello World for WDM

文件名稱:HelloWDM.c

作者:羅聰

日期:2002-8-16

***************************************************************/

//一定要的頭文件,聲明了函數模塊和變量:

#include "helloWDM.h"

//#include //#include //#include //#include //#include

NTSTATUS DriverEntry(?? IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath);

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,

IN PDEVICE_OBJECT PhysicalDeviceObject);

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,

IN PIRP Irp);

/***************************************************************

函數名稱:DriverEntry()

功能描述:WDM程序入口

***************************************************************/

//extern "C"是必須的,表示“用C鏈接”。如果你的文件名是HelloWDM.c的話,這句可以省略。

//extern "C"

NTSTATUS DriverEntry(??? IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath)

{

//指定“添加設備”消息由函數“HelloWDMAddDevice()”來處理:

DriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;

//指定“即插即用”消息由函數“HelloWDMPnp()”來處理:

DriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;

//返回一個NTSTATUS值STATUS_SUCCESS。幾乎所有的驅動程序例程都必須返回一個NTSTATUS值,這些值在NTSTATUS.H DDK頭文件中有詳細的定義。

return STATUS_SUCCESS;

}

/***************************************************************

函數名稱:HelloWDMAddDevice()

功能描述:處理“添加設備”消息

***************************************************************/

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,

IN PDEVICE_OBJECT PhysicalDeviceObject)

{

//定義一個NTSTATUS類型的返回值:

NTSTATUS status;

PDEVICE_OBJECT fdo;

PDEVICE_EXTENSION dx ;

//定義一個功能設備對象(Functional Device Object):

//創建我們的功能設備對象,并儲存到fdo中:

status = IoCreateDevice(

DriverObject,??????????????? //驅動程序對象

sizeof(DEVICE_EXTENSION),??? //要求的設備擴展的大小

NULL,??????????????????????? //設備名稱,這里為NULL

FILE_DEVICE_UNKNOWN,??????? //設備的類型,在標準頭文件WDM.H或NTDDK.H中列出的FILE_DEVICE_xxx值之一

0,??????????????????????????? //各種常量用OR組合在一起,指示可刪除介質、只讀等。

FALSE,??????????????????????? //如果一次只有一個線程可以訪問該設備,為TRUE,否則為FALSE

&fdo);??????????????????????? //返回的設備對象

//NT_SUCCESS宏用于測試IoCreateDevice內核是否成功完成。不要忘記檢查對內核的所有調用是否成功。NT_ERROR宏不等同于!NT_SUCCESS,最好使用!NT_SUCCESS,因為除了錯誤外,它還截獲警告信息。

if( !NT_SUCCESS(status))

return status;

//創建一個設備擴展對象dx,用于存儲指向fdo的指針:

dx= (PDEVICE_EXTENSION)fdo->DeviceExtension;

dx->fdo = fdo;

//用IoAttachDeviceToDeviceStack函數把HelloWDM設備掛接到設備棧:

dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);

//設置fdo的flags。有兩個“位”是必須改變的,一個是必須清除DO_DEVICE_INITIALIZING標志,如果在DriverEntry例程中調用IoCreateDevice(),就不需要清除這個標志位。還有一個是必須設置DO_BUFFER_IO標志位:

fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;

fdo->Flags &= ~DO_DEVICE_INITIALIZING;

//返回值:

return STATUS_SUCCESS;

}

/***************************************************************

函數名稱:HelloWDMPnp()

功能描述:處理“即插即用”消息

***************************************************************/

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,

IN PIRP Irp)

{

//創建一個設備擴展對象dx,用于存儲指向fdo的指針:

PDEVICE_EXTENSION dx;

PIO_STACK_LOCATION IrpStack;

ULONG MinorFunction;

NTSTATUS status;

dx=(PDEVICE_EXTENSION)fdo->DeviceExtension;

//首先要通過函數IoGetCurrentIrpStackLocation()得到當前的IRP,并由此得到Minor Function:

IrpStack = IoGetCurrentIrpStackLocation(Irp);

MinorFunction = IrpStack->MinorFunction;

//然后把這個Minor Function傳遞給下一個設備棧:

IoSkipCurrentIrpStackLocation(Irp);

status = IoCallDriver( dx->NextStackDevice, Irp);

//處理“即插即用”次功能代碼:

//當Minor Function等于IRP_MN_REMOVE_DEVICE時,說明有設備被拔出或卸下,這時要取消資源分配并刪除設備:

if( MinorFunction==IRP_MN_REMOVE_DEVICE)

{

//取消設備接口:

IoSetDeviceInterfaceState(&dx->ifSymLinkName, FALSE);

RtlFreeUnicodeString(&dx->ifSymLinkName);

//調用IoDetachDevice()把fdo從設備棧中脫開:

if (dx->NextStackDevice)

IoDetachDevice(dx->NextStackDevice);

//刪除fdo:

IoDeleteDevice(fdo);

}

//返回值:

return status;

}

####################################################################

/***************************************************************

程序名稱:Hello World for WDM

文件名稱:HelloWDM.h

作者:羅聰

日期:2002-8-16

***************************************************************/

//頭文件,只是聲明一些函數和變量,比較簡單就不多說了,請讀者自行研究:

#include

#ifdef __cplusplus

extern "C"

{

#endif

//#include "c:\winddk\2600\inc\ddk\wxp\ntddk.h"

#ifdef __cplusplus

}

#endif

typedef struct _DEVICE_EXTENSION

{

PDEVICE_OBJECT??? fdo;

PDEVICE_OBJECT??? NextStackDevice;

UNICODE_STRING??? ifSymLinkName;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,

IN PDEVICE_OBJECT PhysicalDeviceObject);

NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,

IN PIRP Irp);

##############################makefile##############################

#

# DO NOT EDIT THIS FILE!!!? Edit .\sources. if you want to add a new source

# file to this component.? This file merely indirects to the real make file

# that is shared by all the driver components of the Windows NT DDK

#

!INCLUDE $(NTMAKEENV)\makefile.def

##########################source####################################

TARGETNAME=HelloWDM

TARGETTYPE=DRIVER

DRIVERTYPE=WDM

TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\inc;\

$(BASEDIR)\inc\ddk\wxp;\

TARGETLIBS=

SOURCES=helloWDM.c\

這里要提醒你,如果你和我一樣喜歡自定義環境變量,那么這里的basedir就自己定義好了

###########################未完成#######################################

總結

以上是生活随笔為你收集整理的ddk开发 c语言,ddk_helloWDM_原代码是网上高手的杰作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。