?? usb_driver.cpp
字號:
NTSTATUS Asgccusb::DriverEntry(PUNICODE_STRING RegistryPath) //驅程入口
{
KRegistryKey Params(RegistryPath, L"Parameters");
if ( NT_SUCCESS(Params.LastError()) )
{
LoadRegistryParameters(Params);
}
m_Unit = 0;
return STATUS_SUCCESS;
}
NTSTATUS Asgccusb::AddDevice(PDEVICE_OBJECT Pdo) //增加設備
{
AsgccusbDevice * pDevice = new (
static_cast<PCWSTR>(KUnitizedName(L"AsgccusbDevice", m_Unit)),
FILE_DEVICE_UNKNOWN,
NULL,
0,
DO_DIRECT_IO
| DO_POWER_PAGABLE
)
AsgccusbDevice(Pdo, m_Unit);
if (pDevice == NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
NTSTATUS status = pDevice->ConstructorStatus();
if ( !NT_SUCCESS(status) )
{
delete pDevice;
}
else
{
m_Unit++;
pDevice->ReportNewDevicePowerState(PowerDeviceD0);
}
return status;
}
NTSTATUS AsgccusbDevice::Read(KIrp I) //讀例程
{
if (!NT_SUCCESS(I.Information()))
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_INVALID_PARAMETER);
}
if (I.ReadSize() == 0)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_SUCCESS);
}
KMemory Mem(I.Mdl());
ULONG dwTotalSize = I.ReadSize(CURRENT);
ULONG dwMaxSize = m_Endpoint2IN.MaximumTransferSize();
if (dwTotalSize > dwMaxSize) //超過最大長度
{
ASSERT(dwMaxSize);
dwTotalSize = dwMaxSize;
}
USB_COMPLETION_INFO*pCompInfo=new(NonPagedPool)USB_COMPLETION_INFO;
if (pCompInfo == NULL)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}
PURB pUrb = m_Endpoint2IN.BuildBulkTransfer(
Mem,
dwTotalSize,
TRUE,
NULL,
TRUE
);
if (pUrb == NULL)
{
delete pCompInfo;
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}
pCompInfo->m_pClass = this;
pCompInfo->m_pUrb = pUrb;
NTSTATUS status;
status = m_Endpoint2IN.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0);
return status;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -