ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3072|ตอบกลับ: 0

[VB6] อ่านค่า Physical Serial Number ของฮาร์ดดิสต์ที่บู๊ตระบบวินโดวส์ด้วย API

[คัดลอกลิงก์]

310

กระทู้

501

โพสต์

6035

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6035




จากตอนที่แล้วได้นำเสนอ
การค้นหา Harddisk ที่ติดตั้ง Windows พร้อมกับอ่านค่า Physical Serial Number ด้วย WMI (Windows Management Instrumentation) มาตอนนี้จะใช้ Win32 API หรือ Application Programming Interface ซึ่งค่อนข้างจะทำความเข้าใจในตัวโค้ดได้ยากมากกว่า WMI แต่ทว่ากลับได้ผลลัพธ์ที่ค่อนข้างจะเที่ยงตรงและแม่นยำ ในกรณีที่ฮาร์ดดิสต์ของคุณมีอยู่หลายลูก และติดตั้งระบบปฏิบัติการวินโดวส์เอาไว้หลายเวอร์ชั่น เรื่องแบบนี้ต้องลองทดสอบกันดูเอาเองครับ ... อนึ่ง!!! สำหรับในตอนนี้แอดมินเลือกใช้ API สำหรับการค้นหาว่าระบบปฏิบัติการมันถูกบู๊ตระบบจากไดร์ฟอะไร (เช่น C) และคืนค่ากลับให้เป็นหมายเลขของ Physical Harddisk แต่เวลาหา Serial Number แอดมินใช้ WMI เข้าช่วย เพื่อให้ง่ายต่อการศึกษา มากกว่าการใช้ API ทั้งหมดครับผม ...

มาดูโค้ดกันเถอะ ... (ส่วนของ Sub Main)
  1. ' / -----------------------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand only)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / MORE: http://www.g2gnet.com/webboard
  8. ' /
  9. ' / Purpose: Get boot disk and read Physical Serial Number.
  10. ' / Microsoft Visual Basic 6.0 Service Pack 6
  11. ' /
  12. ' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
  13. ' / You can modify and/or distribute without to inform the developer.
  14. ' / -----------------------------------------------------------------------------------------------

  15. Option Explicit

  16. Sub Main()
  17.     MsgBox "Boot Disk is Serial Number: " & GetBootDiskSerialNumber, , "VB6 Get Boot Hard Disk"
  18. End Sub

  19. Public Function GetBootDiskSerialNumber() As String
  20. On Error Resume Next
  21.     Dim Objs As Object
  22.     Dim Obj As Object
  23.     Dim WMI As Object
  24.     Dim BootDisk As String
  25.     Dim strComputer As String
  26.     Set WMI = GetObject("WinMgmts:")
  27.     For Each Obj In WMI.InstancesOf("Win32_PhysicalMedia")
  28.         If Obj.Tag = "\\.\PHYSICALDRIVE" + CStr(GetBootPhysicalDrive) Then _
  29.             GetBootDiskSerialNumber = Replace(Trim(Obj.SerialNumber), Chr(0), "")
  30.     Next Obj
  31. End Function
คัดลอกไปที่คลิปบอร์ด



มาดูโค้ดในส่วนของโมดูล ... (API - Application Programming Interface)
  1. ' / -----------------------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand only)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / MORE: http://www.g2gnet.com/webboard
  8. ' /
  9. ' / Purpose: Get boot disk and read Physical Serial Number.
  10. ' / Microsoft Visual Basic 6.0 Service Pack 6
  11. ' /
  12. ' / This is open source code under @Copyleft by Thongkorn Tubtimkrob.
  13. ' / You can modify and/or distribute without to inform the developer.
  14. ' / -----------------------------------------------------------------------------------------------
  15. Option Explicit

  16. Public Const FILE_SHARE_READ = &H1
  17. Public Const FILE_SHARE_WRITE = &H2
  18. Public Const GENERIC_READ = &H80000000
  19. Public Const GENERIC_WRITE = &H40000000
  20. Public Const OPEN_EXISTING = 3

  21. Public Const IOCTL_VOLUME_BASE     As Long = 86 ' Asc("V")
  22. Public Const METHOD_BUFFERED       As Long = 0
  23. Public Const FILE_READ_ACCESS        As Long = 1
  24. Public Const FILE_ANY_ACCESS           As Long = 0

  25. '// DEFINE IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
  26. Public Const IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = _
  27.     (((IOCTL_VOLUME_BASE) * (2& ^ 16&)) Or _
  28.     ((FILE_ANY_ACCESS) * (2& ^ 14&)) Or _
  29.     ((0&) * (2& ^ 2&)) Or _
  30.     (METHOD_BUFFERED))

  31. Public Type DISK_EXTENT
  32.     DiskNumber        As Long
  33.     StartingOffset      As Currency
  34.     ExtentLength       As Currency
  35. End Type

  36. Public Type VOLUME_DISK_EXTENTS
  37.     NumberOfDiskExtents As Currency
  38.     Extents(1 To 4) As DISK_EXTENT
  39. End Type

  40. Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" ( _
  41.     ByVal lpFileName As String, _
  42.     ByVal dwDesiredAccess As Long, _
  43.     ByVal dwShareMode As Long, _
  44.     ByVal lpSecurityAttributes As Long, _
  45.     ByVal dwCreationDisposition As Long, _
  46.     ByVal dwFlagsAndAttributes As Long, _
  47.     ByVal hTemplateFile As Long _
  48.     ) As Long

  49. Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

  50. Public Declare Function GetWindowsDirectory Lib "Kernel32.dll" Alias "GetWindowsDirectoryW" ( _
  51.     ByVal lpBuffer As Long, _
  52.     ByVal uSize As Long _
  53. ) As Long

  54. Public Declare Function DeviceIoControlNoInput Lib "kernel32" Alias "DeviceIoControl" ( _
  55.     ByVal hDevice As Long, _
  56.     ByVal dwIoControlCode As Long, _
  57.     ByVal lpInBuffer As Long, _
  58.     ByVal nInBufferSize As Long, _
  59.     ByRef lpOutBuffer As Any, _
  60.     ByVal nOutBufferSize As Long, _
  61.     ByRef lpBytesReturned As Long, _
  62.     ByVal lpOverlapped As Long _
  63.     ) As Long

  64. '/ Return the index of the physical drive from which we've booted into Windows.
  65. Public Function GetBootPhysicalDrive() As Long

  66.     Dim sWindowsPath        As String
  67.     Dim nRet                As Long
  68.     Dim sDevicePath         As String
  69.     Dim hLogicalBootDrive   As Long
  70.     Dim sVolumeDevice       As String
  71.     Dim uVolumeDiskExtents  As VOLUME_DISK_EXTENTS
  72.     Dim nBytesReturned      As Long

  73.     '/ Allocate space and retrieve the windows directory.
  74.     sWindowsPath = Space$(64)
  75.     nRet = GetWindowsDirectory(StrPtr(sWindowsPath), 64)

  76.     '/ This gives us the volume that Windows is on. Open it.
  77.     sVolumeDevice = "\\." & Left$(sWindowsPath, 2)
  78.     hLogicalBootDrive = CreateFile(sVolumeDevice, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)

  79.     '/ Find out information about this volume.
  80.     nRet = DeviceIoControlNoInput(hLogicalBootDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0&, 0&, uVolumeDiskExtents, LenB(uVolumeDiskExtents), nBytesReturned, 0&)

  81.     If nRet = 0 Then
  82.         '/ Something went wrong. Return error value.
  83.         GetBootPhysicalDrive = -1
  84.     Else
  85.         '/ This is the physical disk number.
  86.         GetBootPhysicalDrive = uVolumeDiskExtents.Extents(1).DiskNumber
  87.     End If

  88.     '/ Close volume.
  89.     CloseHandle hLogicalBootDrive

  90. End Function
คัดลอกไปที่คลิปบอร์ด




ดาวน์โหลดโค้ดต้นฉบับ VB6 ได้ที่นี่ ...


ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-20 20:10 , Processed in 0.172540 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้