读取U盘的型号,解决给分!

解决方案 »

  1.   

    硬盘的还可吧,U不懂,帮你UP
      

  2.   

    应客户要求。他们需要知道插入USB的盘的型号
      

  3.   

    function GetIdeSerialNumber : SerialNumber; 
    const IDENTIFY_BUFFER_SIZE = 512; 
    type 
    TIDERegs = packed record 
    bFeaturesReg : BYTE; // Used for specifying SMART "commands". 
    bSectorCountReg : BYTE; // IDE sector count register 
    bSectorNumberReg : BYTE; // IDE sector number register 
    bCylLowReg : BYTE; // IDE low order cylinder value 
    bCylHighReg : BYTE; // IDE high order cylinder value 
    bDriveHeadReg : BYTE; // IDE drive/head register 
    bCommandReg : BYTE; // Actual IDE command. 
    bReserved : BYTE; // reserved for future use. Must be zero. 
    end; 
    TSendCmdInParams = packed record 
    // Buffer size in bytes 
    cBufferSize : DWORD; 
    // Structure with drive register values. 
    irDriveRegs : TIDERegs; 
    // Physical drive number to send command to (0,1,2,3). 
    bDriveNumber : BYTE; 
    bReserved : Array[0..2] of Byte; 
    dwReserved : Array[0..3] of DWORD; 
    bBuffer : Array[0..0] of Byte; // Input buffer. 
    end; 
    TIdSector = packed record 
    wGenConfig : Word; 
    wNumCyls : Word; 
    wReserved : Word; 
    wNumHeads : Word; 
    wBytesPerTrack : Word; 
    wBytesPerSector : Word; 
    wSectorsPerTrack : Word; 
    wVendorUnique : Array[0..2] of Word; 
    sSerialNumber : Array[0..19] of CHAR; 
    wBufferType : Word; 
    wBufferSize : Word; 
    wECCSize : Word; 
    sFirmwareRev : Array[0..7] of Char; 
    //***************************************
    //这个好像是型号
    sModelNumber : Array[0..39] of Char; 
    //*****************************************
    wMoreVendorUnique : Word; 
    wDoubleWordIO : Word; 
    wCapabilities : Word; 
    wReserved1 : Word; 
    wPIOTiming : Word; 
    wDMATiming : Word; 
    wBS : Word; 
    wNumCurrentCyls : Word; 
    wNumCurrentHeads : Word; 
    wNumCurrentSectorsPerTrack : Word; 
    ulCurrentSectorCapacity : DWORD; 
    wMultSectorStuff : Word; 
    ulTotalAddressableSectors : DWORD; 
    wSingleWordDMA : Word; 
    wMultiWordDMA : Word; 
    bReserved : Array[0..127] of BYTE; 
    end; 
    PIdSector = ^TIdSector; 
    TDriverStatus = packed record 
    // 驱动器返回的错误代码,无错则返回0
    bDriverError : Byte; 
    // IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
    bIDEStatus : Byte; 
    bReserved : Array[0..1] of Byte; 
    dwReserved : Array[0..1] of DWORD; 
    end; 
    TSendCmdOutParams = packed record 
    // bBuffer的大小
    cBufferSize : DWORD; 
    // 驱动器状态
    DriverStatus : TDriverStatus; 
    // 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
    bBuffer : Array[0..0] of BYTE; 
    end; var hDevice : THandle; 
    cbBytesReturned : DWORD; 
    ptr : PChar; 
    SCIP : TSendCmdInParams; 
    aIdOutCmd : Array [0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte; 
    IdOutCmd : TSendCmdOutParams absolute aIdOutCmd; procedure ChangeByteOrder( var Data; Size : Integer ); 
    var ptr : PChar; 
    i : Integer; 
    c : Char; 
    begin 
    ptr := @Data; 
    for i := 0 to (Size shr 1)-1 do 
    begin 
    c := ptr^; 
    ptr^ := (ptr+1)^; 
    (ptr+1)^ := c; 
    Inc(ptr,2); 
    end; 
    end; begin 
    Result := ''; // 如果出错则返回空串
    if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000 
    begin 
    // 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
    hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, 
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); 
    end 
    else // Version Windows 95 OSR2, Windows 98 
    hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 ); 
    if hDevice=INVALID_HANDLE_VALUE then Exit; 
    try 
    FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0); 
    FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0); 
    cbBytesReturned := 0; 
    // Set up data structures for IDENTIFY command. 
    with SCIP do 
    begin 
    cBufferSize := IDENTIFY_BUFFER_SIZE; 
    // bDriveNumber := 0; 
    with irDriveRegs do 
    begin 
    bSectorCountReg := 1; 
    bSectorNumberReg := 1; 
    // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0 
    // else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4); 
    bDriveHeadReg := $A0; 
    bCommandReg := $EC; 
    end; 
    end; 
    if not DeviceIoControl( hDevice, $0007c088, @SCIP, SizeOf(TSendCmdInParams)-1, 
    @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit; 
    finally 
    CloseHandle(hDevice); 
    end; 
    with PIdSector(@IdOutCmd.bBuffer)^ do 
    begin 
    ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) ); 
    (PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0; 
    Result := PChar(@sSerialNumber); 
    end; 
    end; 
    sModelNumber : Array[0..39] of Char; 
    上面的程序稍微改一下,可以试一试,我以前用这段程序度过硬盘的型号
    // WinNT/Win2000 - 你必须拥有对硬盘的读/写访问权限// Win98 
    // SMARTVSD.VXD 必须安装到 \windows\system\iosubsys 
    // (不要忘记在复制后重新启动系统) 
     
      

  4.   

    给你几个API函数以及定义:
    function ReadPhysicalDrive(driveID:integer;buffer:Pointer;bufLen:integer):integer; stdcall; external 'DiskID.dll' name 'ReadPhysicalDriveInNT';
    获得WinNT下的硬盘型号以及序列号。参数driveID为硬盘的位置,IDE1上的主盘为0,类推到IDE2上的从盘的driveID为3。
    function ReadPhysicalDrive9X(driveID:integer;buffer:Pointer;bufLen:integer):integer; stdcall; external 'DiskID.dll' name 'ReadDrivePortsInWin9X'; 
    获得Win9X下的硬盘型号以及序列号。参数同上
    function getHardDriveComputerID:int64; stdcall; external 'DiskID.dll' name 'getHardDriveComputerID';
    获得计算机的ID 
    源程序到这里看看
    http://www.applevb.com/libvb.htm
      

  5.   

    什么型号啊?芯片?生产厂家?大小?我就做U盘以及MP3!!!
      

  6.   

    cow8063(吴七郎)谢谢你拉你的库确实可以读出硬盘的型号,但是不能读出U盘的型号,
      

  7.   

    我现在用的U盘是泰吉通信21206 32M CODISK USB Device
      

  8.   

    你必须把程序放在U盘里运行,才能读出U的型号的。UP
      

  9.   

    现在在98里面我可以知道如何读U盘的型号和监测是否插入了U盘
    现在是在WINDOWS2000上如何做的问题