📄 devioctl.cpp
字号:
//****************************************************************************
NTSTATUS CFuncDevice::OnGetVersion(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetVersion()\n");
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
// Assumes, failed
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
ULONG uOutSize = pStack->Parameters.DeviceIoControl.OutputBufferLength;
PVOID pData = pIrp->AssociatedIrp.SystemBuffer;
ASSERTS_PNPDRV(uOutSize >= sizeof(DWORD));
if (uOutSize >= sizeof(DWORD))
{
//----------------------- Fill version information ---------------------------
WORD* Ver = (WORD*)pData;
*Ver = 1;
pIrp->IoStatus.Information = sizeof(DWORD);
ntStatus = STATUS_SUCCESS;
} // if (uOutSize >= sizeof(DWORD))
STRACE_PNPDRV("<< CFuncDevice::OnGetVersion()- ntStatus=%08lX\n", ntStatus);
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetIdSize ---
//
// Purpose: IOCTL_GET_ID_SIZE handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnGetIdSize(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetIdSize()\n");
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
// Assumes, failed
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
ULONG uOutSize = pStack->Parameters.DeviceIoControl.OutputBufferLength;
PVOID pData = pIrp->AssociatedIrp.SystemBuffer;
ASSERTS_PNPDRV(uOutSize >= sizeof(DWORD));
if (uOutSize >= sizeof(DWORD))
{
//-------------------------- Retrieve device ID ------------------------------
PWSTR wszDevID = PnpGetDeviceID(m_pPdo, BusQueryDeviceID);
PWSTR wszInstID = PnpGetDeviceID(m_pPdo, BusQueryInstanceID);
ASSERTS_PNPDRV(wszDevID != NULL && wszInstID != NULL);
if (wszDevID != NULL && wszInstID != NULL)
{
//*(DWORD *)pData = wcslen(wszDevID) + wcslen(wszInstID) + 2;
*(DWORD *)pData = m_uLength;
pIrp->IoStatus.Information = sizeof(DWORD);
ntStatus = STATUS_SUCCESS;
} // if (wszDevID != NULL && ...
//------------------------------ Free memory ---------------------------------
if (wszDevID != NULL)
ExFreePool(wszDevID);
if (wszInstID != NULL)
ExFreePool(wszInstID);
} // if (uOutSize >= sizeof(DWORD))
STRACE_PNPDRV("<< CFuncDevice::OnGetIdSize()- ntStatus=%08lX\n", ntStatus);
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetId ---
//
// Purpose: IOCTL_GET_ID handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnGetMask(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetId()\n");
NTSTATUS ntStatus = STATUS_SUCCESS;
// Assumes, failed
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
ULONG uOutSize = pStack->Parameters.DeviceIoControl.OutputBufferLength;
WORD* pData = (WORD*)pIrp->UserBuffer;
*pData = m_dwMask;
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnGetId ---
//
// Purpose: IOCTL_GET_ID handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnGetId(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetId()\n");
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
// Assumes, failed
PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
ULONG uOutSize = pStack->Parameters.DeviceIoControl.OutputBufferLength;
PWSTR wszInst = (PWSTR)pIrp->AssociatedIrp.SystemBuffer;
//-------------------------- Retrieve device ID ------------------------------
PWSTR wszDevID = PnpGetDeviceID(m_pPdo, BusQueryDeviceID);
PWSTR wszInstID = PnpGetDeviceID(m_pPdo, BusQueryInstanceID);
ASSERTS_PNPDRV(wszDevID != NULL && wszInstID != NULL);
if (wszDevID != NULL && wszInstID != NULL)
{
STRACE_PNPDRV(" Device ID : %ws\n"
" Instance ID : %ws\n",
wszDevID, wszInstID);
wcscpy(wszInst, wszDevID);
wcscat(wszInst, L"\\");
wcscat(wszInst, wszInstID);
pIrp->IoStatus.Information = uOutSize;
ntStatus = STATUS_SUCCESS;
//------------------------------ Free memory ---------------------------------
if (wszDevID != NULL)
ExFreePool(wszDevID);
if (wszInstID != NULL)
ExFreePool(wszInstID);
} // if (wszDevID != NULL && ...
STRACE_PNPDRV("<< CFuncDevice::OnGetId()- ntStatus=%08lX\n", ntStatus);
return ntStatus;
}
//****************************************************************************
// --- CFuncDevice::OnWorkItem ---
//
// Purpose: Work item
// Input: PASYNC_CTX pCtx - Context
// Output: none
// Written: by Anton V. Krivenko 4/19/2002
//****************************************************************************
void CFuncDevice::OnWorkItem(PASYNC_CTX pCtx)
{
STRACE_PNPDRV(">> CFuncDevice::OnWorkItem()\n");
//--------------------------- Wait some seconds ------------------------------
LARGE_INTEGER liTime; // Waiting interval
liTime.QuadPart = -1 * ASYNC_DELAY;
KeDelayExecutionThread(KernelMode, FALSE, &liTime);
STRACE_PNPDRV(" Completing IRP\n");
//--------------------------- Complete request -------------------------------
PIRP pIrp = pCtx->pIrp;
pIrp->IoStatus.Status = OnGetId(pIrp);
IoCompleteRequest(pCtx->pIrp, IO_NO_INCREMENT);
//---------------------------- Free resources --------------------------------
IoFreeWorkItem(pCtx->pItem); // Free work item
ExFreePool(pCtx); // Remove context
STRACE_PNPDRV("<< CFuncDevice::OnWorkItem()\n");
}
//****************************************************************************
// --- CFuncDevice::OnGetIdAsync ---
//
// Purpose: IOCTL_GET_ID_ASYNC handler
// Input: PIRP pIrp - IRP
// Output: NTSTATUS - Operation status
// Written: by Anton V. Krivenko 4/18/2002
//****************************************************************************
NTSTATUS CFuncDevice::OnGetIdAsync(PIRP pIrp)
{
STRACE_PNPDRV(">> CFuncDevice::OnGetIdAsync()\n");
IoMarkIrpPending(pIrp); // Mark IRP as pending
//---------------- Allocate structure and queue work item --------------------
PASYNC_CTX pCtx = (PASYNC_CTX) ExAllocatePool(NonPagedPool, sizeof(ASYNC_CTX));
pCtx->pItem = IoAllocateWorkItem(m_pDevObject);
pCtx->pIrp = pIrp;
IoQueueWorkItem(pCtx->pItem, _OnWorkItem, DelayedWorkQueue, pCtx);
STRACE_PNPDRV("<< CFuncDevice::OnGetIdAsync()\n");
return STATUS_PENDING;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -