| 发表于:2007-10-26 16:50:523楼 得分:0 |
'取得硬盘信息:型号/物理系列号(唯一) function getharddiskinfo(optional byval numdisk as eumdiskno = hdprimarymaster, optional byval numtype as euminfotype = hdonlysn) as string if getdiskinfo(numdisk) = 1 then dim pserialnumber as string, pmodelnumber as string pserialnumber = strconv(m_diskinfo.sserialnumber, vbunicode) pmodelnumber = strconv(m_diskinfo.smodelnumber, vbunicode) select case numtype case hdonlymodel '仅型号 getharddiskinfo = trim(pmodelnumber) case hdonlysn '"仅系列号 getharddiskinfo = trim(pserialnumber) case else '"型号,系列号 getharddiskinfo = trim(pmodelnumber) & "," & trim(pserialnumber) end select end if end function private function opensmart(byval ndrive as byte) as long dim hsmartioctl as long dim hd as string dim versioninfo as osversioninfo hsmartioctl = invalid_handle_value versioninfo.dwosversioninfosize = len(versioninfo) getversionex versioninfo select case versioninfo.dwplatformid case ver_platform_win32s opensmart = hsmartioctl case ver_platform_win32_windows hsmartioctl = createfile("\\.\smartvsd", 0, 0, 0, create_new, 0, 0) case ver_platform_win32_nt if ndrive < max_ide_drives then 'hd = "file://./physicaldrive" & ndrive hd = "\\.\physicaldrive" & ndrive hsmartioctl = createfile(hd, generic_read or generic_write, file_share_read or file_share_write, 0, open_existing, 0, 0) end if end select opensmart = hsmartioctl end function private function doidentify(byval hsmartioctl as long, pscip as sendcmdinparams, pscop() as byte, byval bidcmd as byte, byval bdrivenum as byte, lpcbbytesreturned as long) as boolean pscip.cbuffersize = identify_buffer_size pscip.irdriveregs.bfeaturesreg = 0 pscip.irdriveregs.bsectorcountreg = 1 pscip.irdriveregs.bsectornumberreg = 1 pscip.irdriveregs.bcyllowreg = 0 pscip.irdriveregs.bcylhighreg = 0 pscip.irdriveregs.bdriveheadreg = &ha0 or ((bdrivenum and 1) * 2 ^ 4) pscip.irdriveregs.bcommandreg = bidcmd pscip.bdrivenumber = bdrivenum pscip.cbuffersize = identify_buffer_size doidentify = cbool(deviceiocontrol(hsmartioctl, dfp_receive_drive_data, _ pscip, 32, _ pscop(0), 528, _ lpcbbytesreturned, 0)) end function private function doenablesmart(byval hsmartioctl as long, pscip as sendcmdinparams, pscop as sendcmdoutparams, byval bdrivenum as byte, lpcbbytesreturned as long) as boolean pscip.cbuffersize = 0 pscip.irdriveregs.bfeaturesreg = smart_enable_smart_operations pscip.irdriveregs.bsectorcountreg = 1 pscip.irdriveregs.bsectornumberreg = 1 pscip.irdriveregs.bcyllowreg = smart_cyl_low pscip.irdriveregs.bcylhighreg = smart_cyl_hi pscip.irdriveregs.bdriveheadreg = &ha0 or ((bdrivenum and 1) * 2 ^ 4) pscip.irdriveregs.bcommandreg = ide_EXECute_smart_function pscip.bdrivenumber = bdrivenum doenablesmart = cbool(deviceiocontrol(hsmartioctl, dfp_send_drive_command, _ pscip, lenb(pscip) - 1, _ pscop, lenb(pscop) - 1, _ lpcbbytesreturned, 0)) end function '--------------------------------------------------------------------- '"--------------------------------------------------------------------- private sub changebyteorder(szstring() as byte, byval uscstrsize as integer) dim i as integer dim btemp as byte for i = 0 to uscstrsize - 1 step 2 btemp = szstring(i) szstring(i) = szstring(i + 1) szstring(i + 1) = btemp next i end sub private sub displayidinfo(pids as idsector, pscip as sendcmdinparams, byval bidcmd as byte, byval bdfpdrivemap as byte, byval bdrivenum as byte) changebyteorder pids.smodelnumber, ubound(pids.smodelnumber) + 1 changebyteorder pids.sfirmwarerev, ubound(pids.sfirmwarerev) + 1 changebyteorder pids.sserialnumber, ubound(pids.sserialnumber) + 1 end sub public function getdiskinfo(byval ndrive as byte) as long dim hsmartioctl as long dim cbbytesreturned as long dim versionparams as getversionoutparams dim scip as sendcmdinparams dim scop() as byte dim outcmd as sendcmdoutparams dim bdfpdrivemap as byte dim bidcmd as byte ' ide or atapi identify cmd dim udisk as idsector m_diskinfo = udisk ' ' hsmartioctl = opensmart(ndrive) if hsmartioctl <> invalid_handle_value then call deviceiocontrol(hsmartioctl, dfp_get_version, byval 0, 0, versionparams, len(versionparams), cbbytesreturned, 0) if not (versionparams.bidedevicemap \ 2 ^ ndrive and &h10) then if doenablesmart(hsmartioctl, scip, outcmd, ndrive, cbbytesreturned) then bdfpdrivemap = bdfpdrivemap or 2 ^ ndrive end if end if bidcmd = iif((versionparams.bidedevicemap \ 2 ^ ndrive and &h10), ide_atapi_id, ide_id_function) redim scop(lenb(outcmd) + identify_buffer_size - 1) as byte if doidentify(hsmartioctl, scip, scop, bidcmd, ndrive, cbbytesreturned) then copymemory m_diskinfo, scop(lenb(outcmd) - 4), lenb(m_diskinfo) call displayidinfo(m_diskinfo, scip, bidcmd, bdfpdrivemap, ndrive) closehandle hsmartioctl getdiskinfo = 1 exit function '> --- > bottom end if closehandle hsmartioctl getdiskinfo = 0 else 'not hsmartioctl... getdiskinfo = -2 end if end function 这是全部dll代码 | | |
|