在VB中对硬盘的底层操作大全

0 Reply , Posted in 程序代码 on 2017 28, 2017

在VB中对硬盘的底层操作大全

 

近段时间硬盘烧了两个,现在这个又总是出毛病,于是就产生研究硬盘的念头,先是用螺丝刀拆开一个硬盘,发现里面

有个Disk,很漂亮,现在已经成为一面镜子了。另外还有一个强力磁铁,真的很强喔,弄到我的显示器还有家里的电视机

现在还红一块紫一块。最后觉得不过瘾,很想学学制造病毒的哥哥,用“软”的方法弄一弄别人的硬盘,

好让心理平衡一点(真变态)。现在将学习过程中的一些冬冬贴出来让大伙look look。

 

一、硬盘基础知识

先讲讲硬盘的几个参数。

1、磁头数(Heads),就是硬盘总共有几个磁头咯,也就是有几面盘片*2,最大值为 256。

2、柱面数(Cylinders),硬盘每一面盘片上有几条磁道(同心圆)呀, 由于以前硬盘大多数是多个盘片的层叠在

一起的,(我拆的这个是单片装的呢)多个盘片的同一个磁道就形成了一个圆柱了,因此称为柱面。最值大为 1024。

3、扇区数(Sectors) 表示一条磁道上有几个扇区, 最大值为63。一个扇区一般是 512个字节

 

以前硬盘容量的计算公式为:x GB= (Heads * Cylinders * Sectors * BytePerSectors)/(1024 * 1024 * 1024)

例如上述各参数都取最大值时硬盘容量为:(256 * 1024 * 63 * 512) / (1024 * 1024 * 1024) = 7.9 GB

可是制作硬盘的JS的公式是:x GB= (Heads * Cylinders * Sectors * BytePerSectors)/(1000 * 1000 * 1000)

这样同一个硬盘就成8.4GB了,欺骗我们善良的心灵。真是无商不J。

 

这也是CHS寻址方式的硬盘容量的极限,在CHS寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 Heads-1,

0 到 Cylinders-1, 1 到 Sectors per track。

为了突破这个容量的极限,后来就出现了 LBA,LARGE 等寻址方式。

 

二、硬盘的数据结构

 

1、硬盘上的0磁头、0柱面、1扇区是最重要的一个扇区,称之为:Boot Sector。

Boot Sector主要由 MBR (Master Boot Record,主引导记录),DPT (Disk Partition Table,分区表)等组成。

MBR占用前446字节(&H0 到 &H1BD),存放系统主引导程序。

DPT占用 64 个字节(&H1BE to &H1FD),记录了磁盘的主分区信息。主分区表分为四个分区项, 每项 16 字节,分别记录了每个主分区的信息,所以最多可以有四个主分区。

最后还有两个字节,分别储存&H55和&HAA,这是判别引导区是否合法的标志。

 

2、Boot Sector 的具体结构如下图(其实是文字来的,将就以下啦)所示:

 

      0000  |------------------------------------------------|

            |                                                |

            |                                                |

            |             Master Boot Record                 |

            |                                                |

            |                                                |

            |             主引导记录(446字节)                |

            |                                                |

            |                                                |

            |                                                |

      01BD  |                                                |

      01BE  |------------------------------------------------|

            |                                                |

      01CD  |             分区信息  1(16字节)                |

      01CE  |------------------------------------------------|

            |                                                |

      01DD  |             分区信息  2(16字节)                |

      01DE  |------------------------------------------------|

            |                                                |

      01ED  |             分区信息  3(16字节)                |

      01EE  |------------------------------------------------|

            |                                                |

      01FD  |             分区信息  4(16字节)                |

            |------------------------------------------------|

            | 01FE                | 01FF                     |

            |         55          |           AA             |

            |------------------------------------------------|

 

MBR中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要作用是检查分区表是 否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。MBR是由分区程序(如Fdisk.com)所产生的, 它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存。所以这里就不讲这部分数据的意思咯,嗬嗬。

 

3、DPT(16个字节)中数据的意义

 

    BYTE State       : 分区状态, 0 = 未激活, 0x80 = 激活

    BYTE StartHead   : 分区起始磁头号

    WORD StartSC     : 分区起始扇区和柱面号, 底字节的低6位为扇区号,

             高2位为柱面号的第 9,10 位, 高字节为柱面号的低 8 位

    BYTE Type        : 分区类型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此项未用

    BYTE EndHead     : 分区结束磁头号

    WORD EndSC       : 分区结束扇区和柱面号, 定义同前

    DWORD Relative   : 在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址)

    DWORD Sectors    : 分区大小 (总扇区数)

 

例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00

最前面的"80"是一个分区的激活标志,表示系统可引导;"01 01 00"表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;"0B"表示分区的系统类型是FAT32,其他比较常用的有 04(FAT16)、07(NTFS);"FE BF FC"表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;"3F 00 00 00"表示首扇区的相对扇区号为63;"7E 86 BB 00"表示总扇区数为12289622。

 

三、用VB直接读取硬盘的数据

硬盘上Boot sector的数据是如此的重要,因此我们就不能用平常的方法去读取了,例如:

open "hdd0" for binary as #1 这样只能是读读文件上的数据而已,那么怎样直接读取硬盘的数据呢?

呵呵,这就要用到几个API咯。

 

首先用 CreateFile API打开一个物理的硬盘,系统中第一个硬盘的名称为 \\\\.\\PHYSICALDRIVE0,第二个硬盘的名称

为\\\\.\\PHYSICALDRIVE1,如果成功地打开,则返回一个指向物理硬盘的句柄,否则返回INVALID_HANDLE_VALUE。

下面的代码可以帮我们找到系统上有多少个物理的硬盘。其中hDevice为物理硬盘的句柄。

 

   dim hDevice  as long

   dim nDevice          as long

   Do

      hDevice = CreateFile("\\\\.\\PHYSICALDRIVE" & CStr(nDevice), _

                            0&, _

                            FILE_SHARE_READ Or FILE_SHARE_WRITE, _

                            ByVal 0&, _

                            OPEN_EXISTING, _

                            0&, 0&)

            

      If hDevice <> INVALID_HANDLE_VALUE Then

         \’//在这里可以添加读取硬盘数据的代码。(*)

         CloseHandle hDevice

         nDevice = nDevice + 1

      Else

         If Err.LastDllError = ERROR_FILE_NOT_FOUND Then

           \’No more physical drives.

            Exit Do

         Else

    \’GetPhysicalDrives error

            Exit Do

         End If

      End If

   Loop

   debug.pring "硬盘总数为:" nDevice

  

当获取了物理硬盘的句柄hDevice之后,就可用 ReadFile Api读取里面的数据了,例如:在上面(*)那里插入下面的语句,

即可读取 BootSector 的内容。

dim Buffer(1 to 512) as Byte

dim hadRead          as long

dim RetVal       as long

dim i       as long

RetVal = ReadFile(hDevice, Buffer(1), 512, hadRead, 0)

If RetVal And (hadRead = UBound(Buffer)) Then

     for i=1 to 512

         debug.print Hex$(Buffer(i)),

     next

Else

     \’Error reading the drive.

End If

哎呀,写到手都软了,剩下的下一节再贴吧。有不正的地方请指出哦。

我之所以贴在这里,是因为…………

因为还有一大堆问题没弄懂呀,我是说真的,不是说笑的,看完第二贴大家一定要慷慨指点呀!!

第一篇中讲到怎样读取物理硬盘的BootRecord的数据,用了如下的方法:

 

Public Const GENERIC_READ = &H80000000

Public Const GENERIC_WRITE = &H40000000

Public Const FILE_SHARE_READ = &H1

Public Const FILE_SHARE_WRITE = &H2

Public Const OPEN_EXISTING = 3

 

\’//为了简单起见,注意下面的声明语句部分地方已经改动过

Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _

    (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _

    lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, _

    ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, _

    ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As Long

Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, _

    ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Long) As Long

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

 

Dim Buffer(1 To 512) As Byte

Dim hDevice As Long

Dim hadRead As Long

hDevice = CreateFile("\\\\.\\PHYSICALDRIVE0", GENERIC_READ Or GENERIC_WRITE, _

    FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0&, 0&)

 

Call ReadFile(hDevice, Buffer(1), 512, hadRead, ByVal 0&) \’//(****)

 

Dim i As Long

For i = 1 To 512

    Debug.Print Hex$(Buffer(i));

Next

 

Call CloseHandle(hDevice)

 

这样数组buffer()里的512Byte的数据即为第一个物理硬盘的BootRecord数据了。我们可以将它保存在另外一个文件里,这样当万一我们的硬盘受到病毒的破坏导致分区不见了,就可以从这个文件恢复BootRecord,从而修复硬盘。

 

啊,那么怎样写数据入BootRecord呢?

MSDN里没有怎么讲,凭着我不入地狱谁入地狱的精神,我试过用WriteFile API函数就可以了,

首先看看怎样在瞬间“清空”硬盘的BootRecord。

 

将上面带 (****) 号的一句换成:

 

\’//注意!千万不要调试/运行本段程序,除非你不想要你的硬盘了(在别人的机上除外哦 :)))

Call WriteFile(hDevice,Buffer(1),512,hadRead,Byval 0&)

 

由于Buffer()里面的数据都是00000……,这样,机器上的第一个物理硬盘的 BootRecord数据全部变成0…000了,换句话说,MBR和主分区表DPT都被破坏了。如果想破坏硬盘上的所有数据,那也是很简单的事,只要不断 地 WriteFile,用0000填充硬盘上的所有数据就可以了,这样硬盘上的其他部分(DBR、FAT、DIR、DATA)都会被清空。(哎呀,怎么越讲 越离题了!都教人搞破坏去了,该批斗!)

 

言归正传了,如果首先在Buffer()存有原来硬盘的BootRecord数据,再调用WriteFile,那么就是变成恢复硬盘的BootRecord了,(要是少了这一步,那真是一失足成千古恨)。

 

下面开始今天的新内容。

 

一、我们知道一个物理硬盘可以分成多个区的,从而形成多个逻辑盘。那么逻辑盘的信息是保存在哪 里的呢?例如一个逻辑盘的卷标、序列号、大小等。其实每个逻辑盘也有类似的BootRecord。而且根据文件系统的不同,其BootRecord的数据 结构都不太相同。下面就列出几种常见的文件系统的BootRecord的数据结构。

 

(1)NTFS的:

Private Type NTFSBOOTRECORD

    JumpCodeAndNop(1 To 3) As Byte

    OEMName(1 To 8) As Byte

    BytesPerSector As Integer

    SectorsPerCluster As Byte

    Unused(1 To 7) As Byte

    MediaDescriptor As Byte

    Unused2 As Integer

    SectorsPerTrack As Integer

    HeadCount As Integer

    Unused3(1 To 8) As Byte

    DontKnow1 As Integer

    DontKnow2 As Integer

    SectorsInStorageUnit As Currency

    LCNMFTData As Currency

    LCNMFTMirrorData As Currency

    FileRecordClusters As Long

    IndexBufferClusters As Long

    SerialNumber As Long

End Type

 

(2)FAT16的:

Private Type FAT12FAT16BOOTRECORD

    JumpCodeAndNop(1 To 3) As Byte

    OEMName(1 To 8) As Byte

    BytesPerSector As Integer

    SectorsPerCluster As Byte

    ReservedSectors As Integer

    NumberOfFATCopies As Byte

    MaxRootDirEntries As Integer \’N/A on FAT32

    SectorsSmallerThan32MB As Integer \’N/A on FAT32

    MediaDescriptor As Byte \’F8h for Hard Disks

    SectorsPerFATOld As Integer  \’N/A on FAT32

    SectorsPerTrack As Integer

    NumberOfHeads As Integer

    HiddenSectors As Long

    Sectors As Long

    

    DriveNum As Byte

    Reserved As Byte

    BootSignature As Byte

    VolumeID As Long

    VolumeLabel(1 To 11) As Byte

    FileSystemType(1 To 8) As Byte

End Type

 

(3)FAT32的:

Private Type FAT32BOOTRECORD

    JumpCodeAndNop(1 To 3) As Byte

    OEMName(1 To 8) As Byte

    BytesPerSector As Integer

    SectorsPerCluster As Byte

    ReservedSectors As Integer

    NumberOfFATCopies As Byte

    MaxRootDirEntries As Integer \’N/A on FAT32

    SectorsSmallerThan32MB As Integer \’N/A on FAT32

    MediaDescriptor As Byte \’F8h for Hard Disks

    SectorsPerFATOld As Integer  \’N/A on FAT32

    SectorsPerTrack As Integer

    NumberOfHeads As Integer

    HiddenSectors As Long

    Sectors As Long

    

    SectorsPerFAT As Long

    Flags As Integer

    Version As Integer

    RootDirectoryCluster As Long

    FileSystemInformationSector  As Integer

    BackupBootSector As Integer

    Reserved(1 To 12) As Byte

    LogicalDriveNumber As Byte

    Unused As Byte

    ExtendedSignature As Byte \’29h

    SerialNumber As Long

    VolumeName(1 To 11) As Byte

    FATName(1 To 8) As Byte

    ExecutableCode(1 To 420) As Byte

    BootRecordSignature(1 To 2) As Byte \’55h AAh

End Type

 

我们怎样知道一个逻辑盘(如C:\\;D:\\;G:\\)的文件系统是什么呢?方法有很多,例如在“我的电脑”中对着逻辑盘右击鼠标,选择“属性”,就可以看到它的文件系统了。(只见一大堆烂番茄飞向小生,“我们要的是用编程方法呀!!SB……”)

 

用 GetVolumeInformation API函数即可轻松搞定了,下面是个获取一个盘的文件系统的自定义函数。其中参数Drive为盘符,如“C:”、“D:”、“I:”

 

Public Function GetFileSystem(Drive As String) As String

    Dim VolName As String, FileSystem As String, SerialNum As Long

    Dim MaxFileLen As Long, Flags As Long

    VolName = String(16,chr$(0))

    FileSystem = String(16,chr$(0))

    GetVolumeInformation Drive & "\\", VolName, Len(VolName) - 1, _

        SerialNum, MaxFileLen, Flags, FileSystem, Len(FileSystem) - 1

    

    Dim Pos As Integer

    Pos = InStr(FileSystem, Chr(0))

    If Pos Then

        GetFileSystem = UCase(Left(FileSystem, Pos - 1))

    Else

        GetFileSystem = UCase(FileSystem)

    End If    

    

End Function

 

好了,最后,怎样读取逻辑盘的BootRecord呢?方法跟读取物理硬盘的BootRecord基本相同。各个逻辑盘的名称为在盘符前面添加"\\\\.\\",如C盘即为"\\\\.\\C:",H盘即为"\\\\.\\H:"

下面例子我们打开D:盘,并读取BootRecord的数据。

 

    Dim hDrive as long

    Dim Buffer(1 To 512) As Byte, Read As Long

    Dim RetVal As Long

    Dim i AS long

 

    hDrive = CreateFile("\\\\.\\D:", GENERIC_READ, FILE_SHARE_READ Or _

        FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)

    If hDrive = INVALID_HANDLE_VALUE Then

        MsgBox "Error opening the drive."

    Else

        RetVal = ReadFile(hDrive, Buffer(1), 512, Read, byval 0&)

        If RetVal And (Read = UBound(Buffer)) Then

            \’//在此打印Buffer里的数据内容

     For i=1 to 512

  Debug.print Hex$(Buffer(i));

     Next

        Else

            MsgBox "Error reading the drive."

        End If

    End If

    CloseHandle hDrive

在VB中对硬盘的底层操作大全(三)及未解难题100分征解

写了前两篇关于硬盘底层操作的文章之后,隔了两天没上过CSDN了,没有什么特别的原因,只是小生的硬盘Short了,紧张了两天才弄好。

在这里要申明一下了:我写的这些文章纯粹是个人学习硬盘原理之中的一些笔记,现在贴出来跟大家交流。不是宣传、爱现、破坏。同时也希望各位大虾、元老批评指正,或者也贴上一些精彩的文章,益益咱们。

好了,下面讲新内容:

获取硬盘信息的几条API。

取得逻辑盘(不是硬盘)的卷标、文件系统类型等:GetVolumeInformation

取得本机所有逻辑盘的盘符:GetLogicalDriveStrings

取得逻辑盘的介质类型:GetDriveType

取得逻辑盘的容量:GetDiskFreeSpaceEx

取得逻辑盘每个扇区的容量:没有直接的函数,可以间接地使用 GetDiskFreeSpace 来取得

例子:

Private Sub a()

    Dim Serial As Long, VName As String, FSName As String

    VName = String$(255, Chr$(0))

    FSName = String$(255, Chr$(0))

    ’Get the volume information

    GetVolumeInformation "C:\", VName, 255, Serial, 0, 0, FSName, 255

    ’Strip the extra chr$(0)’s

    VName = Left$(VName, InStr(1, VName, Chr$(0)) - 1)

    FSName = Left$(FSName, InStr(1, FSName, Chr$(0)) - 1)

    MsgBox "The Volume name of C:\ is ’" + VName + _

           "’, the File system name of C:\ is ’" + FSName + _

           "’ and the serial number of C:\ is ’" + Trim(Str$(Serial)) + "’"

End Sub

Private Sub b()

    Dim strSave As String

    strSave = String(255, Chr$(0))

    ’Get all the drives

    ret& = GetLogicalDriveStrings(255, strSave)

    ’Extract the drives from the buffer and print them on the form

    dim i

    For i = 1 To 26

        If Left$(strSave, InStr(1, strSave, Chr$(0))) = Chr$(0) Then Exit For

        debug.Print Left$(strSave, InStr(1, strSave, Chr$(0)) - 1)

        strSave = Right$(strSave, Len(strSave) - InStr(1, strSave, Chr$(0)))

    Next

End Sub

Private Sub c

    ’Get information about the C:    Select Case GetDriveType("C:\")

        Case 2

            debug.Print "Removable"

        Case 3

            debug.Print "Drive Fixed"

        Case Is = 4

            debug.Print "Remote"

        Case Is = 5

            debug.Print "Cd-Rom"

        Case Is = 6

            debug.Print "Ram disk"

        Case Else

            debug.Print "Unrecognized"

    End Select

End Sub

相信这些函数大家再熟悉不过了,因此不再一一讲述啦。

如果是在Windows2000或WindowsXP中还可以用更强大的 WMI 来帮忙。

例如:

1、取的物理硬盘的信息:

   Dim DiskDriveSet

   Dim dd

   Set DiskDriveSet = GetObject("winmgmts:{impersonationLevel=impersonate}"). _

                                           InstancesOf("Win32_DiskDrive")

       

   For Each dd In DiskDriveSet

           ’identification info

       Debug.Pring  dd.Index    ’//硬盘的编号,如 0、1、2……

       Debug.Pring  dd.DeviceID    ’//设备ID,如\\.\PHYSICALDRIVE1

       Debug.Pring  dd.Model        ’//设备型号,如IC35L040AVER07-0(这个是IBM Deskstar 40G 硬盘的型号,不知道这个

                    是不是就是论坛经常提到的 硬盘序列号。)

       Debug.Pring  dd.MediaType    ’//设备介质类型

       ’physical info

       Debug.Pring  FormatNumber(dd.Size, 0)    ’//盘的容量

       Debug.Pring  dd.Partitions            ’//有多少个分区

       Debug.Pring  FormatNumber(dd.BytesPerSector, 0)   

       Debug.Pring  FormatNumber(dd.SectorsPerTrack, 0)

       Debug.Pring  FormatNumber(dd.TotalCylinders, 0)

   Next    ’//如果有多个硬盘则显示下一个硬盘的信息。

2、取得逻辑盘的信息

   dim LogicalDiskSet

   dim ld

   Set LogicalDiskSet = GetObject("winmgmts:{impersonationLevel=impersonate}"). _

                                  InstancesOf("Win32_LogicalDisk")

    

    

   For Each ld In LogicalDiskSet

    ’元素有很多下面仅列出三个,其他的可以查看MSDN

    Debug.Pring ld.Name

    Debug.Pring ld.Size

    Debug.Pring ld.VolumeName

    Debug.Pring ld.VolumeSerialNumber

   Next

好了,我讲就这么多了,其他更劲的动动就靠大家去探索研究咯。

下面提提我的一些想不通的问题,希望大虾们能帮帮忙,同时也是对这三篇文章的补充吧。

1、用 CreateFile 打开物理硬盘或者逻辑盘只能在 Windows2000 或更高的版本中才支持,在Win98以下则不行(包括前两篇文章中的所有例子,都只能在Windows2000中运行。)

那么在Win98中怎样才能打开物理硬盘进行底层操作呢??????

相信大家或许都见过用过 Vopt,就是那个比Win98本身那个更好用的磁盘整理工具,它是用VisualBaisc6写的,我真是对它的作者TMD佩服。它可以在Win98中工作,它是怎样实现的呢?????

2、怎样不用 WMI 列出机器上有多少个硬盘、每个硬盘上每个分区的盘符是什么??(假设我有多个硬盘)

这个问题很头疼呀?大伙们帮帮忙吧!!!!!!!

3、如果用 WMI 实现第二题的功能,就是这样子:

Dim DiskSet

Dim Disk

Debug.Print "用Win32_DiskDrive 取得物理盘的个数,及每个盘有多少个分区"

Set DiskSet = GetObject("winmgmts:").ExecQuery("select * from Win32_DiskDrive")

For Each Disk In DiskSet

   Debug.Print "(" & Disk.Index & ") " & Disk.Name & " = (" & Disk.MediaType & ") => " & Disk.Partitions

Next

Debug.Print "用Win32_DiskPartition 取得每个分区的信息,(不包含盘符)"

Set DiskSet = GetObject("winmgmts:").ExecQuery("Select * From Win32_DiskPartition")

For Each Disk In DiskSet

    Debug.Print Disk.Name & " = " & Disk.Index & " => " & Disk.DiskIndex

Next

Debug.Print "用Win32_LogicalDisk 取逻辑盘(包含盘符)"

Set DiskSet = GetObject("winmgmts:").ExecQuery("select * from Win32_LogicalDisk")

For Each Disk In DiskSet

   Debug.Print Disk.Name & " = (" & Disk.DriveType & ") => " & Disk.VolumeName

Next

不过……………………

他们的功能都是独立的,没有关联的。

即我不可以得到一个物理硬盘的所有分区的盘符是什么!!!

用 WMI 的 ASSOCIATORS 也没用。

上次vb技术支持用这样的方法可以得出某个盘符是属于那个物理盘(假设我有多个硬盘)

Set DiskSet = GetObject("winmgmts:").ExecQuery("Associators of {win32_LogicalDisk=’C:’} where ResultClass = Win32_DiskPartition")

For Each dd In DiskSet

    Debug.Print dd.Name & " => " & dd.DiskIndex

Next

我当时以为问题得解了,可是这样做却不行:

Set DiskSet = GetObject("winmgmts:").ExecQuery("Associators of {Win32_DiskDrive=0} where ResultClass = win32_LogicalDisk")

For Each dd In DiskSet

    Debug.Print dd.Name

Next

????????????????????????

我的目的是统计出计算机上有多少个硬盘 要列出某个硬盘(如hdd0)中的所有盘符(如:C:、D:、E:),怎么做呀???

用WMI行、用API更好、能在Win98上运行最好!!

我为了想这个S问题而不陪MM,已经和MM吵架了。大伙们救救我呀!!

标签:   

相关推荐

vb读取access并且显示  (2017-5-11 9:18:27)

VB 获取CPU温度示例  (2017-5-8 10:35:11)

VB程序逆向反汇编常见的函数   (2017-5-8 10:32:0)

VB内嵌汇编的模块示例  (2017-5-8 10:24:4)

内存数据的读写(PC)   (2017-3-1 17:51:40)

用VB制作外挂   (2017-3-1 16:16:53)

发表评论:



◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

                       

  鄂公网安备 42112502000156号     鄂ICP备16019550号