?? ch375wdm.c
字號:
// 這是CH372和CH375的Windows98/ME/2000/XP簡化版驅(qū)動程序, 僅供學習USB驅(qū)動開發(fā)
// 稍加修改完全可以用于其它USB芯片, 不過作者希望你是用于CH372和CH375芯片
// 2003.09.08, 2003.12.28, 2004.10.15, 2004.12.05, 2004.12.10, 2005.01.20, 2005.02.23, 2005.07.15
//****************************************
//** Copyright (C) W.ch 1999-2005 **
//** Web: http://www.winchiphead.com **
//****************************************
//** WDM for USB interface chip CH375 **
//** C, VC5.0, Windows 98 DDK **
//****************************************
//
// USB總線接口芯片CH375的WDM驅(qū)動程序 V0.1
// 南京沁恒電子有限公司 作者: W.ch 2005.07
// CH375-WDM V0.1 , Support: Ctrl/Bulk/Int
// 運行環(huán)境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH372/CH375
//
#define mTHIS_VERSION 0x01 // 當前版本
#define mTHIS_VER_STR "0.1" // 當前版本字符串
#include <wdm.h>
#include <usbdi.h>
#include <usbdlib.h>
#include "CH375WDM.H"
typedef struct _DEVICE_EXTENSION { // 定義設(shè)備擴展結(jié)構(gòu)
UNICODE_STRING mExtDeviceName; // 設(shè)備名稱
PDEVICE_OBJECT mExtPhysicalTarget; // 物理設(shè)備對象指針
PDEVICE_OBJECT mExtNextLowerDevice; // 下級設(shè)備對象指針
USBD_PIPE_HANDLE mExtInterUpPipe; // USB中斷數(shù)據(jù)上傳管道的句柄
USBD_PIPE_HANDLE mExtAuxDownPipe; // USB輔助數(shù)據(jù)下傳管道的句柄
USBD_PIPE_HANDLE mExtDataDownPipe; // USB數(shù)據(jù)塊下傳管道的句柄
USBD_PIPE_HANDLE mExtDataUpPipe; // USB數(shù)據(jù)塊上傳管道的句柄
ULONG mExtIoCount; // 計數(shù)正在進行的操作,以阻止操作中途停止或者移除設(shè)備
ULONG mExtDeviceOpen; // 指示設(shè)備被打開的次數(shù)
BOOLEAN mExtDeviceStart; // 指示設(shè)備啟動狀態(tài)
BOOLEAN mExtDeviceRemove; // 指示設(shè)備移除狀態(tài)
} mDEVICE_EXTENSION, *mPDEVICE_EXTENSION;
// 驅(qū)動程序說明
UCHAR mDescription[128] = " CH375 WDM V" mTHIS_VER_STR " "
" Author : W.ch "
"HX.S065 2003.12\xd\xa"
" www.wch99.com \xd\xa"
" Copyright (C) W.ch 1999-2005 \xd\xa\x0";
PDRIVER_OBJECT mDriverObject = NULL;
// 子程序說明
NTSTATUS DriverEntry( PDRIVER_OBJECT iDriverObject, PUNICODE_STRING iRegistryPath );
VOID mDriverUnload( PDRIVER_OBJECT iDriverObject );
NTSTATUS mAddDevice( PDRIVER_OBJECT iDriverObject, PDEVICE_OBJECT iPhysicalDeviceObject );
VOID mRemoveDevice( PDEVICE_OBJECT iDeviceObject );
NTSTATUS mDispatchCreate( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mDispatchClose( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mDispatchDeviceControl( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mRequestPipe( PDEVICE_OBJECT iDeviceObject, USHORT iFunction, ULONG iPipe );
NTSTATUS mDispatchCleanup( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mDispatchPower( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mDispatchSystemControl( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mDispatchPnp( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mWaitCompletion( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mCompletionRoutine( PDEVICE_OBJECT iDeviceObject, PIRP iIrp, PVOID iContext );
NTSTATUS mActiveConfig( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mDeactiveConfig( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS mUsbSubmitUrb( PDEVICE_OBJECT iDeviceObject, PURB iUrb );
#ifdef ALLOC_PRAGMA
#pragma alloc_text( INIT, DriverEntry )
#endif
NTSTATUS DriverEntry( // 驅(qū)動程序初始化入口
PDRIVER_OBJECT iDriverObject, // 驅(qū)動程序?qū)ο? PUNICODE_STRING iRegistryPath )
{
mDriverObject = iDriverObject; // 保存驅(qū)動程序?qū)ο?// while ( mDriverObject ); // 調(diào)試
iDriverObject -> MajorFunction[ IRP_MJ_CREATE ] = mDispatchCreate; // 創(chuàng)建或者打開設(shè)備
iDriverObject -> MajorFunction[ IRP_MJ_CLOSE ] = mDispatchClose; // 關(guān)閉設(shè)備
iDriverObject -> MajorFunction[ IRP_MJ_DEVICE_CONTROL ] = mDispatchDeviceControl; // 設(shè)備控制
iDriverObject -> MajorFunction[ IRP_MJ_CLEANUP ] = mDispatchCleanup; // 取消操作
iDriverObject -> MajorFunction[ IRP_MJ_POWER ] = mDispatchPower; // 電源管理
iDriverObject -> MajorFunction[ IRP_MJ_SYSTEM_CONTROL ] = mDispatchSystemControl; // 系統(tǒng)WMI接口
iDriverObject -> MajorFunction[ IRP_MJ_PNP ] = mDispatchPnp; // 設(shè)備PnP操作
iDriverObject -> DriverUnload = mDriverUnload; // 卸載驅(qū)動程序
iDriverObject -> DriverExtension -> AddDevice = mAddDevice; // 檢測到新硬件設(shè)備
return( STATUS_SUCCESS );
}
VOID mDriverUnload( // 卸載驅(qū)動程序
PDRIVER_OBJECT iDriverObject )
{
mDriverObject = NULL; // 清除驅(qū)動程序?qū)ο?指示系統(tǒng)線程終止
}
NTSTATUS mAddDevice( // 添加新設(shè)備的PnP例程
PDRIVER_OBJECT iDriverObject, // 驅(qū)動程序?qū)ο? PDEVICE_OBJECT iPhysicalDeviceObject )
{
PDEVICE_OBJECT mDeviceObject = NULL;
mPDEVICE_EXTENSION mDeviceExtension;
NTSTATUS mStatus = STATUS_INSUFFICIENT_RESOURCES;
__try { // 確保退出前的處理
mStatus = IoCreateDevice( iDriverObject, sizeof( mDEVICE_EXTENSION ), NULL, // 創(chuàng)建設(shè)備對象
FILE_DEVICE_UNKNOWN, 0, FALSE, &mDeviceObject ); // 返回的設(shè)備對象
if ( ! NT_SUCCESS( mStatus ) ) __leave; // 創(chuàng)建設(shè)備失敗
mDeviceExtension = mDeviceObject -> DeviceExtension; // 設(shè)備擴展指針
RtlZeroMemory( mDeviceExtension, sizeof( mDEVICE_EXTENSION ) ); // 清除內(nèi)存
mDeviceExtension -> mExtPhysicalTarget = iPhysicalDeviceObject; // 物理設(shè)備的功能設(shè)備對象
mDeviceExtension -> mExtIoCount = 0; // 清操作計數(shù)
mDeviceExtension -> mExtDeviceOpen = 0; // 清除設(shè)備打開標志
mDeviceExtension -> mExtDeviceStart = FALSE; // 清除設(shè)備啟動標志
mDeviceExtension -> mExtDeviceRemove = FALSE; // 清除設(shè)備移除標志
mDeviceExtension -> mExtNextLowerDevice = IoAttachDeviceToDeviceStack( mDeviceObject, // 掛接設(shè)備棧,返回下級設(shè)備
iPhysicalDeviceObject ); // 指向物理對象
if ( mDeviceExtension -> mExtNextLowerDevice == NULL ) { // 掛接設(shè)備棧失敗
mStatus = STATUS_UNSUCCESSFUL; // 返回錯誤信息
__leave;
}
mStatus = IoRegisterDeviceInterface( iPhysicalDeviceObject, &CH375Guid, // 注冊設(shè)備接口
NULL, & mDeviceExtension -> mExtDeviceName ); // 保存符號鏈接名稱
mDeviceObject -> Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; // 緩沖IO,指示代碼可能在分頁內(nèi)存中
mDeviceObject -> Flags &= ~DO_DEVICE_INITIALIZING; // 初始化完成
}
__finally { // 退出前的處理
if ( ! NT_SUCCESS( mStatus ) ) { // 初始化失敗
mRemoveDevice( mDeviceObject ); // 移除設(shè)備
}
}
return( STATUS_SUCCESS );
}
VOID mRemoveDevice( // 移除設(shè)備
PDEVICE_OBJECT iDeviceObject )
{
ULONG mDeviceInstance;
mPDEVICE_EXTENSION mDeviceExtension;
if ( iDeviceObject == NULL ) return; // 設(shè)備對象無效
mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴展
if ( mDeviceExtension -> mExtDeviceName.Buffer != NULL ) { // 已經(jīng)注冊設(shè)備接口
IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, FALSE ); // 禁用設(shè)備接口
RtlFreeUnicodeString( & mDeviceExtension -> mExtDeviceName ); // 釋放設(shè)備名稱緩沖區(qū)
mDeviceExtension -> mExtDeviceName.Buffer = NULL;
}
if ( mDeviceExtension -> mExtNextLowerDevice != NULL ) { // 已經(jīng)掛接到設(shè)備棧
IoDetachDevice( mDeviceExtension -> mExtNextLowerDevice ); // 撤出設(shè)備棧
mDeviceExtension -> mExtNextLowerDevice = NULL;
}
IoDeleteDevice( iDeviceObject ); // 刪除設(shè)備對象
}
NTSTATUS mDispatchCreate( // 新建或者打開
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴展
iIrp -> IoStatus.Information = 0;
InterlockedIncrement( & mDeviceExtension -> mExtDeviceOpen ); // 打開計數(shù)增量
iIrp -> IoStatus.Status = STATUS_SUCCESS; // 返回操作狀態(tài)
IoCompleteRequest( iIrp, IO_NO_INCREMENT ); // 完成請求
return( STATUS_SUCCESS ); // 返回狀態(tài)
}
NTSTATUS mDispatchClose( // 關(guān)閉
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴展
InterlockedDecrement( & mDeviceExtension -> mExtDeviceOpen ); // 關(guān)閉則打開計數(shù)減量
iIrp -> IoStatus.Status = STATUS_SUCCESS; // 返回操作狀態(tài)
iIrp -> IoStatus.Information = 0;
IoCompleteRequest( iIrp, IO_NO_INCREMENT ); // 完成請求
return( STATUS_SUCCESS ); // 返回狀態(tài)
}
NTSTATUS mDispatchDeviceControl( // 設(shè)備控制
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
UCHAR mRequestType, mRequestCode;
USHORT mRequestValue, mRequestIndex;
ULONG mControlCode;
ULONG mFunction, mLength, mReturn;
ULONG mTransferFlags, mParameter;
PVOID mBuffer;
mPWIN32_COMMAND mWin32Command;
NTSTATUS mStatus;
PURB mUrb;
PIO_STACK_LOCATION mCurrentIrpStack;
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴展
InterlockedIncrement( & mDeviceExtension -> mExtIoCount ); // 操作計數(shù)增量,阻止中途停止或者移除設(shè)備
mCurrentIrpStack = IoGetCurrentIrpStackLocation( iIrp ); // 當前棧單元指針
mControlCode = mCurrentIrpStack -> Parameters.DeviceIoControl.IoControlCode; // 操作命令
if ( mControlCode == IOCTL_CH375_COMMAND ) { // 專用接口
mStatus = STATUS_SUCCESS; // 返回狀態(tài)預置為成功
mReturn = 0; // 返回數(shù)據(jù)長度預置為0
mUrb = ExAllocatePool( NonPagedPool, sizeof( URB ) ); // 分配內(nèi)存作為URB請求塊
if ( mUrb != NULL && mCurrentIrpStack -> Parameters.DeviceIoControl.InputBufferLength >= mWIN32_COMMAND_HEAD ) { // 輸入緩沖區(qū)長度有效
mWin32Command = iIrp -> AssociatedIrp.SystemBuffer; // 命令緩沖區(qū)
mFunction = mWin32Command -> mFunction; // 功能代碼
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -