?? ch375wdm.c
字號:
mLength = mWin32Command -> mLength; // 存取長度
mBuffer = & mWin32Command -> mBuffer[0]; // 數(shù)據(jù)緩沖區(qū)
switch( mFunction ) { // 分析功能代碼
case mFuncGetVersion: // 獲取版本號
while ( mLength >= sizeof( ULONG ) && *(PULONG)mBuffer == 'hc.W' ); // 等待調(diào)試工具W.ch
*(PUCHAR)mBuffer = mTHIS_VERSION; // 驅(qū)動程序版本號
mReturn = sizeof( UCHAR ); // 返回?cái)?shù)據(jù)長度
break;
case mPipeDeviceCtrl: // CH375的綜合控制管道
mRequestType = mWin32Command -> mSetupPkt.mUspReqType; // 請求類型
mRequestCode = mWin32Command -> mSetupPkt.mUspRequest; // 請求碼
mRequestValue = mWin32Command -> mSetupPkt.mUspValue; // 數(shù)值參數(shù)
mRequestIndex = mWin32Command -> mSetupPkt.mUspIndex; // 索引參數(shù)
mLength = mWin32Command -> mSetupPkt.mLength; // 后續(xù)操作的數(shù)據(jù)長度
mTransferFlags = ( ( mRequestType & 0x80 ) != 0 ? USBD_TRANSFER_DIRECTION_IN : 0 ) | USBD_SHORT_TRANSFER_OK; // 傳輸標(biāo)志
switch( mRequestType >> 5 & 0x03 ) { // 分析請求類型
case 0: // 標(biāo)準(zhǔn)請求
switch( mRequestCode ) { // 分析請求碼
case USB_REQUEST_GET_DESCRIPTOR: // 獲取描述符
mParameter = ( mRequestValue >> 8 ) == 1 ? USB_DEVICE_DESCRIPTOR_TYPE : USB_CONFIGURATION_DESCRIPTOR_TYPE; // 描述符類型
UsbBuildGetDescriptorRequest( mUrb, sizeof( struct _URB_CONTROL_DESCRIPTOR_REQUEST ), // 構(gòu)造獲取描述符URB
(UCHAR)mParameter, 0, 0, mBuffer, NULL, mLength, NULL );
mStatus = mUsbSubmitUrb( iDeviceObject, mUrb ); // 提交URB
mReturn = mUrb -> UrbControlDescriptorRequest.TransferBufferLength; // 實(shí)際傳輸長度
break;
default: // 不支持
mStatus = STATUS_INVALID_PARAMETER; // 返回錯誤
break;
}
break;
default: // 不支持的請求
mStatus = STATUS_INVALID_PARAMETER; // 返回錯誤
break;
}
break;
case mPipeInterUp: // CH375的中斷數(shù)據(jù)上傳管道
if ( mDeviceExtension -> mExtInterUpPipe != NULL ) { // 管道有效
mTransferFlags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK; // 傳輸標(biāo)志
UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ), // 構(gòu)造USB請求
mDeviceExtension -> mExtInterUpPipe, // 管道的句柄
mBuffer, NULL, mLength, mTransferFlags, NULL ); // 操作標(biāo)志
mStatus = mUsbSubmitUrb( iDeviceObject, mUrb ); // 提交URB
mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength; // 實(shí)際傳輸長度
if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeInterUp ); // 出錯則復(fù)位管道
}
else mStatus = STATUS_NO_SUCH_DEVICE ; // 管道無效,設(shè)備無效
break;
case mPipeAuxDown: // CH375的輔助數(shù)據(jù)下傳管道
if ( mDeviceExtension -> mExtAuxDownPipe != NULL ) { // 管道有效
mTransferFlags = USBD_SHORT_TRANSFER_OK; // 傳輸標(biāo)志
UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ), // 構(gòu)造USB請求
mDeviceExtension -> mExtAuxDownPipe, // 管道的句柄
mBuffer, NULL, mLength, mTransferFlags, NULL ); // 操作標(biāo)志
mStatus = mUsbSubmitUrb( iDeviceObject, mUrb ); // 提交URB
mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength; // 實(shí)際傳輸長度
if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeAuxDown ); // 出錯則復(fù)位管道
}
else mStatus = STATUS_NO_SUCH_DEVICE ; // 管道無效,設(shè)備無效
break;
case mPipeDataUp: // CH375的數(shù)據(jù)塊上傳管道
if ( mDeviceExtension -> mExtDataUpPipe != NULL ) { // 管道有效
mTransferFlags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK; // 傳輸標(biāo)志
UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ), // 構(gòu)造USB請求
mDeviceExtension -> mExtDataUpPipe, // 管道的句柄
mBuffer, NULL, mLength, mTransferFlags, NULL ); // 操作標(biāo)志
mStatus = mUsbSubmitUrb( iDeviceObject, mUrb ); // 提交URB
mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength; // 實(shí)際傳輸長度
if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeDataUp ); // 出錯則復(fù)位管道
}
else mStatus = STATUS_NO_SUCH_DEVICE ; // 管道無效,設(shè)備無效
break;
case mPipeDataDown: // CH375的數(shù)據(jù)塊下傳管道
if ( mDeviceExtension -> mExtDataDownPipe != NULL ) { // 管道有效
mTransferFlags = USBD_SHORT_TRANSFER_OK; // 傳輸標(biāo)志
UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ), // 構(gòu)造USB請求
mDeviceExtension -> mExtDataDownPipe, // 管道的句柄
mBuffer, NULL, mLength, mTransferFlags, NULL ); // 操作標(biāo)志
mStatus = mUsbSubmitUrb( iDeviceObject, mUrb ); // 提交URB
mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength; // 實(shí)際傳輸長度
if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeDataDown ); // 出錯則復(fù)位管道
}
else mStatus = STATUS_NO_SUCH_DEVICE ; // 管道無效,設(shè)備無效
break;
case mFuncResetPipe: // 復(fù)位USB管道
mStatus = mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, *(PULONG)mBuffer ); // 在指定管道執(zhí)行復(fù)位請求
break;
case mFuncAbortPipe: // 取消USB管道的數(shù)據(jù)請求
mStatus = mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, *(PULONG)mBuffer ); // 在指定管道執(zhí)行取消請求
break;
default: // 不支持的請求
mStatus = STATUS_INVALID_PARAMETER; // 返回錯誤
break;
}
mWin32Command -> mStatus = mStatus; // 返回操作狀態(tài)
mWin32Command -> mLength = mReturn; // 實(shí)際傳輸長度
mReturn += mWIN32_COMMAND_HEAD; // 加上頭部長度得返回?cái)?shù)據(jù)的總長度
}
else { // 失敗
if ( mUrb == NULL ) mStatus = STATUS_INSUFFICIENT_RESOURCES; // 資源不夠
else mStatus = STATUS_BUFFER_TOO_SMALL; // 緩沖區(qū)太小
}
if ( mUrb != NULL ) ExFreePool( mUrb ); // 釋放內(nèi)存
if ( mStatus != STATUS_PENDING ) { // 成功返回或者失敗返回
iIrp -> IoStatus.Status = mStatus; // 返回狀態(tài)
iIrp -> IoStatus.Information = mReturn; // 返回?cái)?shù)據(jù)的長度
IoCompleteRequest( iIrp, 4 );
}
}
else { // 直接傳送至下級設(shè)備處理
IoSkipCurrentIrpStackLocation( iIrp ); // 直接傳送當(dāng)前棧
mStatus = IoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp ); // 傳送至下級設(shè)備
}
InterlockedDecrement( & mDeviceExtension -> mExtIoCount ); // 操作計(jì)數(shù)減量
return( mStatus );
}
NTSTATUS mRequestPipe( // 在指定管道上執(zhí)行請求
PDEVICE_OBJECT iDeviceObject,
USHORT iFunction,
ULONG iPipe )
{
PURB mUrb;
NTSTATUS mStatus;
ULONG mPortStatus;
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴(kuò)展
mUrb = ExAllocatePool( NonPagedPool, sizeof( URB ) ); // 分配內(nèi)存作為URB請求塊
if ( mUrb == NULL ) return( STATUS_INSUFFICIENT_RESOURCES ); // 資源不夠
mUrb -> UrbHeader.Length = sizeof( struct _URB_PIPE_REQUEST );
mUrb -> UrbHeader.Function = iFunction;
switch( iPipe ) { // 指定管道
case mPipeInterUp: // CH375的中斷數(shù)據(jù)上傳管道
mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtInterUpPipe;
break;
case mPipeAuxDown: // CH375的輔助數(shù)據(jù)下傳管道
mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtAuxDownPipe;
break;
case mPipeDataUp: // CH375的數(shù)據(jù)塊上傳管道
mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtDataUpPipe;
break;
case mPipeDataDown: // CH375的數(shù)據(jù)塊下傳管道
mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtDataDownPipe;
break;
default: // 不支持
mUrb -> UrbPipeRequest.PipeHandle = NULL; // 管道無效
break;
}
if ( mUrb -> UrbPipeRequest.PipeHandle == NULL ) mStatus = STATUS_NO_SUCH_DEVICE ; // 管道無效
else mStatus = mUsbSubmitUrb( iDeviceObject, mUrb ); // 提交URB
ExFreePool( mUrb ); // 釋放內(nèi)存
return( mStatus );
}
NTSTATUS mDispatchCleanup( // 取消操作
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
ULONG i;
ULONG mPortStatus;
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴(kuò)展
if ( mDeviceExtension -> mExtIoCount != 0 ) { // 有未完成的操作請求
mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeDataDown ); // 在下傳管道執(zhí)行取消請求
mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeDataUp ); // 在上傳管道執(zhí)行取消請求
mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeInterUp ); // 取消請求
}
iIrp -> IoStatus.Status = STATUS_SUCCESS; // 返回成功
iIrp -> IoStatus.Information = 0;
IoCompleteRequest( iIrp, IO_NO_INCREMENT ); // 完成請求
return( STATUS_SUCCESS ); // 返回狀態(tài)
}
NTSTATUS mDispatchPower( // 電源管理
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴(kuò)展
PoStartNextPowerIrp( iIrp ); // 開始下一個操作
IoSkipCurrentIrpStackLocation( iIrp ); // 直接傳送當(dāng)前棧
return( PoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp ) ); // 傳送至下級設(shè)備
}
NTSTATUS mDispatchSystemControl( // 系統(tǒng)WMI控制
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴(kuò)展
IoSkipCurrentIrpStackLocation( iIrp ); // 直接傳送當(dāng)前棧
return( IoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp ) ); // 傳送至下級設(shè)備
}
NTSTATUS mDispatchPnp( // 即插即用
PDEVICE_OBJECT iDeviceObject,
PIRP iIrp )
{
ULONG i, mCompletion; // 0:下傳, 1:完成, 2:返回狀態(tài)
NTSTATUS mStatus;
PDEVICE_OBJECT mNextDeviceObject;
mPDEVICE_EXTENSION mDeviceExtension = iDeviceObject -> DeviceExtension; // 設(shè)備擴(kuò)展
mNextDeviceObject = mDeviceExtension -> mExtNextLowerDevice ;
mCompletion = 0; // 預(yù)置為下傳
switch( IoGetCurrentIrpStackLocation( iIrp ) -> MinorFunction ) { // 檢查PnP子功能代碼
case IRP_MN_START_DEVICE: // 啟動設(shè)備
mStatus = mWaitCompletion( iDeviceObject, iIrp ); // 等待IRP完成
if ( NT_SUCCESS( mStatus ) ) { // 設(shè)備啟動完成
mStatus = mActiveConfig( iDeviceObject, iIrp ); // 設(shè)備啟動完成則激活配置
if ( NT_SUCCESS( mStatus ) ) { // 設(shè)備配置完成
mDeviceExtension -> mExtDeviceStart = TRUE; // 置設(shè)備啟動標(biāo)志
mDeviceExtension -> mExtDeviceRemove = FALSE; // 清設(shè)備移除標(biāo)志
IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, TRUE ); // 允許設(shè)備接口
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -