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

📄 computer00usbiorw.cpp

📁 usb自定义设备编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// Computer00UsbIorw.cpp
//
// Generated by C DriverWizard 3.2.0 (Build 2485)
// Requires DDK Only
// File created on 8/22/2008
//
#include "Computer00UsbApp.h"

///////////////////////////////////////////////////////////////////////////////////////////////////
//  Computer00UsbReadCompleteCallback
//      Callback to complete application processing of Read request
//
//  Arguments:
//      IN  Context
//              Our I/O request item
//
//  Return Value:
//      none
//
VOID Computer00UsbReadCompleteCallback(PVOID Context)
{
    PCOMPUTER00USB_LIST_ITEM ioItem = (PCOMPUTER00USB_LIST_ITEM)Context;

    Computer00UsbOutputText(
        _T("Executed ReadFile: buffer size (%d), return length (%d) error (%d)"),
        ioItem->OutSize,
        ioItem->ReturnLength,
        ioItem->Error
        );

    // Dump the output buffer
    Computer00UsbOutputBuffer(ioItem->OutBuffer, ioItem->ReturnLength);

    // Free our buffer memory
    free(ioItem->OutBuffer);

    // Close our overlapped event handle
    CloseHandle(ioItem->IoOverlapped.hEvent);

    // Free our ioItem memory
    free(ioItem);

    return;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  Computer00UsbWriteCompleteCallback
//      Callback to complete application processing of Write request
//
//  Arguments:
//      IN  Context
//              Our I/O request item
//
//  Return Value:
//      none
//
VOID Computer00UsbWriteCompleteCallback(PVOID Context)
{
    PCOMPUTER00USB_LIST_ITEM ioItem = (PCOMPUTER00USB_LIST_ITEM)Context;

    Computer00UsbOutputText(
        _T("Executed WriteFile: buffer size (%d), return length (%d) error (%d)"),
        ioItem->InSize,
        ioItem->ReturnLength,
        ioItem->Error
        );

    // Free our buffer memory
    free(ioItem->InBuffer);

    // Close our overlapped event handle
    CloseHandle(ioItem->IoOverlapped.hEvent);

    // Free our ioItem memory
    free(ioItem);

    return;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  Computer00UsbEP1_READCompleteCallback
//      Callback to complete application processing of I/O request
//
//  Arguments:
//      IN  Context
//              Our I/O request item
//
//  Return Value:
//      none
//
VOID Computer00UsbEP1_READCompleteCallback(PVOID Context)
{
    PCOMPUTER00USB_LIST_ITEM ioItem = (PCOMPUTER00USB_LIST_ITEM)Context;

    Computer00UsbOutputText(
        _T("Executed EP1_READ request: in buffer size (%d), out buffer size (%d), return length (%d) error (%d)"),
        ioItem->InSize,
        ioItem->OutSize,
        ioItem->ReturnLength,
        ioItem->Error
        );

    // Dump the output buffer
    Computer00UsbOutputBuffer(ioItem->OutBuffer, ioItem->ReturnLength);

    // Free our buffer memory
    free(ioItem->InBuffer);
    free(ioItem->OutBuffer);

    // Close our overlapped event handle
    CloseHandle(ioItem->IoOverlapped.hEvent);

    // Free our ioItem memory
    free(ioItem);

    return;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  Computer00UsbEP1_WRITECompleteCallback
//      Callback to complete application processing of I/O request
//
//  Arguments:
//      IN  Context
//              Our I/O request item
//
//  Return Value:
//      none
//
VOID Computer00UsbEP1_WRITECompleteCallback(PVOID Context)
{
    PCOMPUTER00USB_LIST_ITEM ioItem = (PCOMPUTER00USB_LIST_ITEM)Context;

    Computer00UsbOutputText(
        _T("Executed EP1_WRITE request: in buffer size (%d), out buffer size (%d), return length (%d) error (%d)"),
        ioItem->InSize,
        ioItem->OutSize,
        ioItem->ReturnLength,
        ioItem->Error
        );

    // Dump the output buffer
    Computer00UsbOutputBuffer(ioItem->OutBuffer, ioItem->ReturnLength);

    // Free our buffer memory
    free(ioItem->InBuffer);
    free(ioItem->OutBuffer);

    // Close our overlapped event handle
    CloseHandle(ioItem->IoOverlapped.hEvent);

    // Free our ioItem memory
    free(ioItem);

    return;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  Computer00UsbEP2_READCompleteCallback
//      Callback to complete application processing of I/O request
//
//  Arguments:
//      IN  Context
//              Our I/O request item
//
//  Return Value:
//      none
//
VOID Computer00UsbEP2_READCompleteCallback(PVOID Context)
{
    PCOMPUTER00USB_LIST_ITEM ioItem = (PCOMPUTER00USB_LIST_ITEM)Context;

    Computer00UsbOutputText(
        _T("Executed EP2_READ request: in buffer size (%d), out buffer size (%d), return length (%d) error (%d)"),
        ioItem->InSize,
        ioItem->OutSize,
        ioItem->ReturnLength,
        ioItem->Error
        );

    // Dump the output buffer
    Computer00UsbOutputBuffer(ioItem->OutBuffer, ioItem->ReturnLength);

    // Free our buffer memory
    free(ioItem->InBuffer);
    free(ioItem->OutBuffer);

    // Close our overlapped event handle
    CloseHandle(ioItem->IoOverlapped.hEvent);

    // Free our ioItem memory
    free(ioItem);

    return;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  Computer00UsbEP2_WRITECompleteCallback
//      Callback to complete application processing of I/O request
//
//  Arguments:
//      IN  Context
//              Our I/O request item
//
//  Return Value:
//      none
//
VOID Computer00UsbEP2_WRITECompleteCallback(PVOID Context)
{
    PCOMPUTER00USB_LIST_ITEM ioItem = (PCOMPUTER00USB_LIST_ITEM)Context;

    Computer00UsbOutputText(
        _T("Executed EP2_WRITE request: in buffer size (%d), out buffer size (%d), return length (%d) error (%d)"),
        ioItem->InSize,
        ioItem->OutSize,
        ioItem->ReturnLength,
        ioItem->Error
        );

    // Dump the output buffer
    Computer00UsbOutputBuffer(ioItem->OutBuffer, ioItem->ReturnLength);

    // Free our buffer memory
    free(ioItem->InBuffer);
    free(ioItem->OutBuffer);

    // Close our overlapped event handle
    CloseHandle(ioItem->IoOverlapped.hEvent);

    // Free our ioItem memory
    free(ioItem);

    return;
}

//////////////////////////////////////////////////////////////////////////////
//  Computer00UsbExecuteIo
//      Routine to execute the user chosen I/O type
//
//  Arguments:
//      IN  hDlg
//              Handle to dialog
//
//  Return Value:
//      status.
//
ULONG Computer00UsbExecuteIo(HWND hDlg)
{
    TCHAR               str[MAX_STRING_LENGTH];
    HWND                hWnd;
    ULONG               error = ERROR_SUCCESS;
    DWORD               inPattern;
    DWORD               outPattern;
    DWORD               ii;
    DWORD               itemIndex;
    PCOMPUTER00USB_LIST_ITEM  ioItem;

    Computer00UsbOutputText(_T("Computer00UsbExecuteIo++"));

    // Use do/while to handle cleanup
    do
    {
        // Allocate a list entry
        ioItem = (PCOMPUTER00USB_LIST_ITEM)malloc(sizeof(COMPUTER00USB_LIST_ITEM));
        if (ioItem == NULL)
        {
            Computer00UsbOutputText(_T("Failed to create read I/O list entry, ReadFile not executed"));
            error = ERROR_OUTOFMEMORY;
            break;
        }

        ZeroMemory(ioItem, sizeof(COMPUTER00USB_LIST_ITEM));

        // Setup the overlapped struct

        // Zero the overlapped structure.  Make sure this is done anytime
        // an overlapped structure is reused as well.
        ZeroMemory(&ioItem->IoOverlapped, sizeof(OVERLAPPED));

        // Setup the event
        ioItem->IoOverlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (ioItem->IoOverlapped.hEvent == NULL)
        {
            error = GetLastError();
            Computer00UsbOutputText(_T("NewTextExecuteIo failed to allocate overlapped event error (%d)"), error);
            break;
        }

        // Get the buffer sizes
        GetDlgItemText(hDlg, IDC_IN_SIZE_EDIT, str, MAX_STRING_LENGTH);
        ioItem->InSize = _ttol(str);

        GetDlgItemText(hDlg, IDC_OUT_SIZE_EDIT, str, MAX_STRING_LENGTH);
        ioItem->OutSize = _ttol(str);

        // Get the data patterns
        GetDlgItemText(hDlg, IDC_IN_DATA_EDIT, str, MAX_STRING_LENGTH);
        (VOID)_stscanf(str, _T("%x"), &inPattern);

        GetDlgItemText(hDlg, IDC_OUT_DATA_EDIT, str, MAX_STRING_LENGTH);
        (VOID)_stscanf(str, _T("%x"), &outPattern);

        // Setup the transfer
        hWnd = GetDlgItem(hDlg, IDC_OP_TYPE_COMBO);

        // Get the current operation selection
        itemIndex = (DWORD)SendMessage(hWnd, CB_GETCURSEL, 0, 0);

        // Get the selection text
        SendMessage(hWnd, CB_GETLBTEXT, (WPARAM)itemIndex, (LPARAM)str);

        if ((!_tcscmp(str, _T("ReadFile"))) && (ioItem->OutSize > 0))
        {
            // Setup the read buffer
            ioItem->OutBuffer = (PCHAR)malloc(ioItem->OutSize);
            if (ioItem->OutBuffer == NULL)
            {
                Computer00UsbOutputText(_T("Failed to create read buffer, ReadFile not executed"));
                error = ERROR_OUTOFMEMORY;
                break;
            }

            // set the out buffer data
            for (ii = 0; ii < ioItem->OutSize; ii += sizeof(DWORD))
            {
                CopyMemory(
                    ioItem->OutBuffer + ii,
                    &outPattern,
                    min(sizeof(DWORD),
                    ioItem->OutSize - ii)
                    );
            }

            if ((!ReadFile(
                    g_hDevice,
                    ioItem->OutBuffer,
                    ioItem->OutSize,
                    NULL,
                    &ioItem->IoOverlapped)) &&
                 (GetLastError() != ERROR_IO_PENDING))
            {
                error = GetLastError();
                Computer00UsbOutputText(_T("ReadFile failed with error (%d)"), error);
                break;
            }

            // Setup the entry
            ioItem->Callback = Computer00UsbReadCompleteCallback;

            Computer00UsbOutputText(_T("Adding entry to list"));

            // Get our list protection
            EnterCriticalSection(&g_IoListLock);

            // Add this entry to the end of the list
            ioItem->Next = &g_IoList;
            ioItem->Previous = g_IoList.Previous;

            g_IoList.Previous->Next = ioItem;
            g_IoList.Previous = ioItem;

            // Drop our list protection
            LeaveCriticalSection(&g_IoListLock);

            Computer00UsbOutputText(_T("Added entry to list"));

            break;
        }

        if ((!_tcscmp(str, _T("WriteFile"))) && (ioItem->InSize > 0))
        {
            // Setup the write buffer
            ioItem->InBuffer = (PCHAR)malloc(ioItem->InSize);
            if (ioItem->InBuffer == NULL)
            {
                Computer00UsbOutputText(_T("Failed to create write buffer, WriteFile not executed"));
                error = ERROR_OUTOFMEMORY;
                break;
            }

            // set the in buffer data
            for (ii = 0; ii < ioItem->InSize; ii += sizeof(DWORD))
            {
                CopyMemory(
                    ioItem->InBuffer + ii,
                    &inPattern,
                    min(sizeof(DWORD), ioItem->InSize - ii)
                    );
            }

            if ((!WriteFile(
                    g_hDevice,
                    ioItem->InBuffer,
                    ioItem->InSize,
                    NULL,
                    &ioItem->IoOverlapped)) &&
                 (GetLastError() != ERROR_IO_PENDING))
            {
                error = GetLastError();
                Computer00UsbOutputText(_T("WriteFile failed with error (%d)"), error);
                break;
            }

            // Setup the entry
            ioItem->Callback = Computer00UsbWriteCompleteCallback;

            Computer00UsbOutputText(_T("Adding entry to list"));

            // Get our list protection
            EnterCriticalSection(&g_IoListLock);

            // Add this entry to the end of the list
            ioItem->Next = &g_IoList;
            ioItem->Previous = g_IoList.Previous;

            g_IoList.Previous->Next = ioItem;
            g_IoList.Previous = ioItem;

            // Drop our list protection
            LeaveCriticalSection(&g_IoListLock);

            Computer00UsbOutputText(_T("Added entry to list"));

            break;
        }

        if ((!_tcscmp(str, _T("EP1_READ"))) && ((ioItem->OutSize > 0) || (ioItem->InSize > 0)))
        {
            // Setup the in buffer if specified
            if (ioItem->InSize > 0)
            {
                ioItem->InBuffer = (PCHAR)malloc(ioItem->InSize);
                if (ioItem->InBuffer == NULL)
                {
                    error = ERROR_OUTOFMEMORY;
                    Computer00UsbOutputText(_T("Failed to create in buffer, EP1_READ not executed"));
                    break;
                }

                // set the in buffer data
                for (ii = 0; ii < ioItem->InSize; ii += sizeof(DWORD))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -