USB设备放入PC后,会有自动探测的流程。
我用应用程序Eject driver 后,那如何再次装载新的驱动?或者说,如何让windows再次自动探测设备并装载driver.

解决方案 »

  1.   

    用SetupDI的一套函数试试,
    例如SetupDiEnumDeviceInfo
      

  2.   

    直接启用、禁用USB设备不是更简单么?
      

  3.   

    今天看到一个应用程序调用USB驱动程序.C,看看对你有用没有?
    #include "stdafx.h"#include <windows.h>
    #include <stdio.h>
    #include <winioctl.h>
    #include <basetyps.h>
    #include <usbdi.h>// Microsoft released two setupapi.h files: one in Win98 DDK and
    // the other one in VC/C++. We shall use the one in Win98 DDK.
    // In oder to resolve this conflict, we have copied setupapi.h
    // and setupapi.lib from Win98 DDK to current working directory.
    #include "setupapi.h"#include "ioctl.h"
    #include "GUIDUDK.h"// Generated from the GUID registered by the driver itself
    char completeDeviceName[256] = "";
    HANDLE
    OpenOneDevice (
    IN HDEVINFO HardwareDeviceInfo,
    IN PSP_DEVICE_INTERFACE_DATA DeviceInfoData,
    IN char* devName
    )
    /*++
    Routine Description:Given the HardwareDeviceInfo, representing a handle to the plug and
    play information, and deviceInfoData, representing a specific usb device,
    open that device and fill in all the relevant information in the given
    USB_DEVICE_DESCRIPTOR structure.Arguments:HardwareDeviceInfo: handle to info obtained from Pnp mgr via SetupDiGetClassDevs()
    DeviceInfoData: ptr to info obtained via SetupDiEnumInterfaceDevice()Return Value:return HANDLE if the open and initialization was successfull,
    else INVLAID_HANDLE_VALUE.--*/
    {
    PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;
    ULONG predictedLength = 0;
    ULONG requiredLength = 0;
    HANDLE hOut = INVALID_HANDLE_VALUE;//
    // allocate a function class device data structure to receive the
    // goods about this particular device.
    //
    SetupDiGetInterfaceDeviceDetail
    (
    HardwareDeviceInfo,
    DeviceInfoData,
    NULL, // Probing so no output buffer yet
    0, // Probing so output buffer length of zero
    &requiredLength,
    NULL // Not interested in the specific dev-node
    );predictedLength = requiredLength;functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc (predictedLength);
    functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);//
    // Retrieve the information from Plug and Play.
    //
    if (!SetupDiGetInterfaceDeviceDetail (
    HardwareDeviceInfo,
    DeviceInfoData,
    functionClassDeviceData,
    predictedLength,
    &requiredLength,
    NULL))
    {
    return INVALID_HANDLE_VALUE;
    }strcpy(devName,functionClassDeviceData->DevicePath);hOut = CreateFile (
    functionClassDeviceData->DevicePath,
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, // No SECURITY_ATTRIBUTES structure
    OPEN_EXISTING, // No special create flags
    0, // No special attributes
    NULL); // No template fileif (INVALID_HANDLE_VALUE == hOut)
    {
    }free(functionClassDeviceData);return hOut;
    }HANDLE
    OpenUsbDevice(LPGUID pGuid, char *outNameBuf)
    /*++
    Routine Description:Do the required PnP things in order to find 
    the next available proper device in the system at this time.Arguments:pGuid: ptr to GUID registered by the driver itself
    outNameBuf: the generated name for this deviceReturn Value:return HANDLE if the open and initialization was successful,
    else INVLAID_HANDLE_VALUE.
    --*/
    {
    ULONG NumberDevices;
    HANDLE hOut = INVALID_HANDLE_VALUE;
    HDEVINFO hardwareDeviceInfo;
    SP_DEVICE_INTERFACE_DATA deviceInfoData;
    ULONG i;
    BOOLEAN done;
    PUSB_DEVICE_DESCRIPTOR usbDeviceInst;
    PUSB_DEVICE_DESCRIPTOR* UsbDevices = &usbDeviceInst;*UsbDevices = NULL;
    NumberDevices = 0;//
    // Open a handle to the plug and play dev node.
    // SetupDiGetClassDevs() returns a device information set that contains info on all 
    // installed devices of a specified class.
    //
    hardwareDeviceInfo = SetupDiGetClassDevs(
    pGuid,
    NULL, // Define no enumerator (global)
    NULL, // Define no
    (DIGCF_PRESENT | // Only Devices present
    DIGCF_INTERFACEDEVICE)); // Function class devices.//
    // Take a wild guess at the number of devices we have;
    // Be prepared to realloc and retry if there are more than we guessed
    //
    NumberDevices = 4;
    done = FALSE;
    deviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);i = 0;
    while (!done)
    {
    NumberDevices *= 2;if (*UsbDevices)
    {
    *UsbDevices = (PUSB_DEVICE_DESCRIPTOR)realloc(*UsbDevices, (NumberDevices * sizeof(USB_DEVICE_DESCRIPTOR)));

    else 
    {
    *UsbDevices = (PUSB_DEVICE_DESCRIPTOR)calloc(NumberDevices, sizeof(USB_DEVICE_DESCRIPTOR));
    }if (NULL == *UsbDevices)
    {
    // SetupDiDestroyDeviceInfoList destroys a device information set 
    // and frees all associated memory.SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
    return INVALID_HANDLE_VALUE;
    }usbDeviceInst = *UsbDevices + i;for (; i < NumberDevices; i++)
    {
    // SetupDiEnumDeviceInterfaces() returns information about device interfaces 
    // exposed by one or more devices. Each call returns information about one interface;
    // the routine can be called repeatedly to get information about several interfaces
    // exposed by one or more devices.if (SetupDiEnumDeviceInterfaces(hardwareDeviceInfo,
    0, // We don't care about specific PDOs
    pGuid,
    i,
    &deviceInfoData))
    {
    hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, outNameBuf);
    if (hOut != INVALID_HANDLE_VALUE)
    {
    done = TRUE;
    break;
    }

    else 
    {
    if (ERROR_NO_MORE_ITEMS == GetLastError()) 
    {
    done = TRUE;
    break;
    }
    }
    }
    }NumberDevices = i;// SetupDiDestroyDeviceInfoList() destroys a device information set 
    // and frees all associated memory.SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);if (*UsbDevices) 
    free(*UsbDevices);return hOut;
    }BOOL
    GetUsbDeviceFileName(LPGUID pGuid, char *outNameBuf)
    /*++
    Routine Description:Given a ptr to a driver-registered GUID, give us a string with the device name
    that can be used in a CreateFile() call.
    Actually briefly opens and closes the device and sets outBuf if successfull;
    returns FALSE if not Arguments:pGuid: ptr to GUID registered by the driver itself
    outNameBuf: the generated zero-terminated name for this deviceReturn Value:TRUE on success else FALSE--*/
    {
    HANDLE hDev = OpenUsbDevice(pGuid, outNameBuf);
    if (hDev != INVALID_HANDLE_VALUE)
    {
    CloseHandle(hDev);
    return TRUE;
    }
    return FALSE;
    }HANDLE
    open_dev()
    /*++
    Routine Description:Called by dumpUsbConfig() to open an instance of our deviceArguments:NoneReturn Value:Device handle on success else NULL--*/
    {HANDLE hDEV = OpenUsbDevice((LPGUID)&GUID_NETAC_UDK2000, completeDeviceName);return hDEV;
    }HANDLE
    open_file(char *filename)
    /*++
    Routine Description:Called by main() to open an instance of our device after obtaining its nameArguments:NoneReturn Value:Device handle on success else NULL--*/
    {
    HANDLE h;if (!GetUsbDeviceFileName( 
    (LPGUID) &GUID_NETAC_UDK2000, 
    completeDeviceName))
    {
    return INVALID_HANDLE_VALUE; 
    }strcat(completeDeviceName, "\\"); strcat(completeDeviceName, filename); h = CreateFile(completeDeviceName,
    GENERIC_WRITE | GENERIC_READ,
    FILE_SHARE_WRITE | FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);return h;
    }
      

  4.   

    好了,谢谢几位,虽然没有确切的办法,方向总是对的。bow