⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 devioctl.cpp

📁 RTL8139 网卡驱动源码 for WinCE.net CEPC
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//****************************************************************************
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 + -