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_原代码是网上高手的杰作的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        