在xp下如何同时显示我的U盘的两个分区的盘符???? |
尚未結案
|
gongyu
一般會員 發表:1 回覆:3 積分:0 註冊:2007-11-28 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
如果 USB 隨身碟只有一個分割, 判斷 磁碟代號的方法如下
如果您研究出多分割的判斷法, 希望可以分享一下 偵測USB儲存裝置的插拔和磁碟代號(含SourceCode) http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=91493 [code cpp] { 程式說明 : 用 WM_DEVICECHANGE 和 DBT_DEVICEARRIVAL 偵測 USB 儲存裝置的插拔 並且顯示出剛剛插入的 USB Flash 磁碟代號 開發工具 : Delphi 7 Enterprise 參考 : http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=58642 http://forums.adelavida.com/?Idx=delphi&Status=9865306168 http://www.amxku.net/?action=show&id=801 } unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } OldWindowProc: TWndMethod; procedure FormWndProc(var Message: TMessage); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ShellApi; const DBT_DEVICEARRIVAL = $8000; // system detected a new device DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone DBT_DEVTYP_VOLUME = $00000002; // logical volume DBTF_MEDIA = $0001; // media comings and goings type PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR; TDEV_BROADCAST_HDR = packed record dbch_size : DWORD; dbch_devicetype : DWORD; dbch_reserved : DWORD; end; PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME; TDEV_BROADCAST_VOLUME = packed record dbcv_size : DWORD; dbcv_devicetype : DWORD; dbcv_reserved : DWORD; dbcv_unitmask : DWORD; dbcv_flags : WORD; end; procedure TForm1.FormCreate(Sender: TObject); begin OldWindowProc:= WindowProc; WindowProc := FormWndProc; end; procedure TForm1.FormWndProc(var Message: TMessage); var lpdb : PDEV_BROADCAST_HDR; lpdbv : PDEV_BROADCAST_VOLUME; unitmask:DWORD; i: Integer; begin lpdb := PDEV_BROADCAST_HDR(Message.LParam); OldWindowProc(Message); if (Message.Msg=WM_DEVICECHANGE) then begin if (Message.WParam=DBT_DEVICEARRIVAL) then begin Memo1.Lines.Add('新插入了一項裝置!'); if lpdb.dbch_devicetype=DBT_DEVTYP_VOLUME then begin lpdbv := PDEV_BROADCAST_VOLUME(lpdb); unitmask:=lpdbv.dbcv_unitmask;//取得 USB 隨身碟的磁碟代號 for i:=0 to 25 do //遍?磁? begin if Boolean(unitmask and $1)then break; unitmask := unitmask shr 1; end; Memo1.Lines.Add('USB 隨身碟的磁碟代號 : ' Char(Ord('A') i) ); end; end; if (Message.WParam=DBT_DEVICEREMOVECOMPLETE) then begin Memo1.Lines.Add('卸除了一項裝置!'); end; end; end; end. [/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-11-29 10:11:50, 註解 無‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
U盤 是單指 USB 隨身碟 ? 單指 USB 硬碟 ? 泛指 USB 隨身碟 and USB 硬碟 ? 小弟在 [檔案總管] 的 [我的電腦] 按下滑鼠右鍵, 選 [管理] 選 [磁碟管理], 在 USB 隨身碟的 區塊上按下滑鼠右鍵, [刪除磁碟分割] 是 灰色的 在 USB 硬碟的 區塊上按下滑鼠右鍵, [刪除磁碟分割] 是可用的 請問您使用哪套軟體或方法將 USB 隨身碟做分割 ? PS: 小弟 USB HD 上很多資料, 不能砍了做測試
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
gongyu
一般會員 發表:1 回覆:3 積分:0 註冊:2007-11-28 發送簡訊給我 |
我指的是:USB 隨身碟,即在windows下默认只有一个分区的U盘,不是移动硬盘;
我已经实现了在默认时只显示一个分区的USB隨身碟上分出多个区来,但windows2000、xp、2003都只认USB隨身碟的首分区,剩下的分区都不认,我不知道该怎么做??? 查过网络上的资料,说受限于windows自身的USB驱动中的getmaxlun,lun总是返回1,表示只有一个分区可用,那么U盘的的多个分区只被windows认出第一个分区,其他的分区无效。 我的想法是修改返回的lun只,就是不知道在哪儿修改,deviceiocontrol可行否????还是在驱动中修改(如果是的话,在什么驱动中修改,如文件系统过滤驱动(呵呵,我只知道文件系统过滤驱动,因为我做加解密的)) 我已经实现了USB隨身碟的整盘加解密,现在需要分区的支持 帮帮我啊
------
生活就是工作,工作就是生活--对我来说足以! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
gongyu
一般會員 發表:1 回覆:3 積分:0 註冊:2007-11-28 發送簡訊給我 |
回楼上的
自己用vc编写的程序 利用deviceiocontrol 我在问问题啊,结果。。。郁闷 楼上的,给你我的代码,就一个函数,自己看:(对了调用此函数diskno一定不要是0,diskno表示存储设备的顺序0一般都是系统盘) BOOL usb_fdisk_for_ori(int diskno) { PARTITION_INFORMATION_EX arraypartinfn_x[3]; DRIVE_LAYOUT_INFORMATION_EX* drivelayout_x; LPDWORD lpBytesReturned; char szTmp[260]; DWORD junk = 0; CREATE_DISK crtdisk; BOOL flag; DISK_GEOMETRY diskGeometry; int nDosLinkCreated; char szDosDevice[260], szCFDevice[260]; DWORD dwCB; BYTE lpSectBuff[513] = {0}; BOOT * BootRecord; PARTITION * PartitionTable; DRIVE_LAYOUT_INFORMATION_EX *temp = NULL; char cserr[256], osver[2]; FunGetOSVersion(osver); DWORD szNewLayout = sizeof(DRIVE_LAYOUT_INFORMATION_EX) 4*sizeof(PARTITION_INFORMATION_EX); drivelayout_x = (DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[szNewLayout]; if (drivelayout_x == NULL) { return FALSE; } ZeroMemory(drivelayout_x, szNewLayout); memset(szTmp, 0, sizeof(szTmp)); sprintf (szTmp, "\\Device\\Harddisk%d\\Partition%d", diskno, 0); nDosLinkCreated = UCSFakeDosNameForDevice (szTmp, szDosDevice,szCFDevice, FALSE); HANDLE volumeHandle = CreateFile(szCFDevice,GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if (volumeHandle == INVALID_HANDLE_VALUE) { //cout<<"error in opening device"; DefineDosDevice (DDD_RAW_TARGET_PATH | DDD_EXACT_MATCH_ON_REMOVE | DDD_REMOVE_DEFINITION, szDosDevice, szTmp); return FALSE; } DefineDosDevice (DDD_RAW_TARGET_PATH | DDD_EXACT_MATCH_ON_REMOVE | DDD_REMOVE_DEFINITION, szDosDevice, szTmp); SetFilePointer(volumeHandle, 0, 0, FILE_BEGIN); ReadFile(volumeHandle, lpSectBuff, 512, &dwCB, NULL); BootRecord = (BOOT *) lpSectBuff; PartitionTable = (PARTITION *) (lpSectBuff 0x1BE); flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize (LPVOID) &diskGeometry, // output buffer (DWORD) sizeof(diskGeometry), // size of output buffer (LPDWORD) &lpBytesReturned, // number of bytes returned NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"get geometry with error", GetLastError()); sprintf(cserr, "get geometry with error%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } WriteTracks(volumeHandle,&diskGeometry); temp = (DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[szNewLayout]; if(osver[0] == '0') { flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_GET_DRIVE_LAYOUT, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize (LPVOID) temp, // output buffer (DWORD) szNewLayout, // size of output buffer (LPDWORD) &lpBytesReturned, // number of bytes returned (LPOVERLAPPED) NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"get drive_x layout with error ", GetLastError()); sprintf(cserr, "get drive_x layout with error%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } } else { flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize (LPVOID) temp, // output buffer (DWORD) szNewLayout, // size of output buffer (LPDWORD) &lpBytesReturned, // number of bytes returned (LPOVERLAPPED) NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"get drive_x layout with error ", GetLastError()); sprintf(cserr, "get drive_x layout with error%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } } crtdisk.PartitionStyle = PARTITION_STYLE_MBR; if(osver[0] != '0') { flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_CREATE_DISK, // dwIoControlCode (LPVOID) &crtdisk, // input buffer (DWORD) sizeof(CREATE_DISK), // size of input buffer NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) &lpBytesReturned, // number of bytes returned (LPOVERLAPPED)NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"create disk with error ", GetLastError()); sprintf(cserr, "create disk with error%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } } DWORD VirtBufSize; //大小 VirtBufSize = (diskGeometry. TracksPerCylinder)* (diskGeometry. SectorsPerTrack) * (diskGeometry. BytesPerSector)* diskGeometry.Cylinders.QuadPart; arraypartinfn_x[0].PartitionNumber = 0; arraypartinfn_x[0].StartingOffset.QuadPart = PUBPARTITION_START; arraypartinfn_x[0].PartitionLength.QuadPart = // PUBPARTITION_START;//((((diskGeometry.Cylinders.QuadPart * diskGeometry.TracksPerCylinder)* diskGeometry.SectorsPerTrack)) * diskGeometry.BytesPerSector) - 1024*1024*10 - SYSREVERS_SIZE; (PUBPARTITION_SIZE);//SYSREVERS_SIZE;//SYSREVERS_SIZE; //32k bytes arraypartinfn_x[0].Mbr.BootIndicator = FALSE; arraypartinfn_x[0].Mbr.RecognizedPartition = TRUE; arraypartinfn_x[0].Mbr.HiddenSectors = 32;//(arraypartinfn_x[0].StartingOffset.QuadPart - 1)/diskGeometry.BytesPerSector; arraypartinfn_x[0].Mbr.PartitionType = PARTITION_FAT_16; arraypartinfn_x[0].RewritePartition =TRUE; arraypartinfn_x[0].PartitionStyle = PARTITION_STYLE_MBR; arraypartinfn_x[1].PartitionNumber = 1; arraypartinfn_x[1].StartingOffset.QuadPart = PUBPARTITION_START PUBPARTITION_SIZE; arraypartinfn_x[1].PartitionLength.QuadPart = // PUBPARTITION_START;//((((diskGeometry.Cylinders.QuadPart * diskGeometry.TracksPerCylinder)* diskGeometry.SectorsPerTrack)) * diskGeometry.BytesPerSector) - 1024*1024*10 - SYSREVERS_SIZE; (PUBPARTITION_SIZE*2);//SYSREVERS_SIZE;//SYSREVERS_SIZE; //32k bytes arraypartinfn_x[1].Mbr.BootIndicator = FALSE; arraypartinfn_x[1].Mbr.RecognizedPartition = TRUE; arraypartinfn_x[1].Mbr.HiddenSectors = 0;//(arraypartinfn_x[0].StartingOffset.QuadPart - 1)/diskGeometry.BytesPerSector; arraypartinfn_x[1].Mbr.PartitionType = PARTITION_FAT_16; arraypartinfn_x[1].RewritePartition =TRUE; arraypartinfn_x[1].PartitionStyle = PARTITION_STYLE_MBR; drivelayout_x->PartitionCount = 2; drivelayout_x->PartitionEntry[0] = arraypartinfn_x[0]; drivelayout_x->PartitionEntry[1] = arraypartinfn_x[1]; drivelayout_x->PartitionStyle = PARTITION_STYLE_MBR; DRIVE_LAYOUT_INFORMATION_MBR mbrlayout; mbrlayout.Signature = temp->Mbr.Signature; drivelayout_x->Mbr = mbrlayout; if(osver[0] == '0') { flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_SET_DRIVE_LAYOUT_EX, // dwIoControlCode (LPVOID) drivelayout_x, // input buffer (DWORD) szNewLayout, // size of input buffer NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) &lpBytesReturned, // number of bytes returned (LPOVERLAPPED) NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"set drive_x layout with error ", GetLastError()); sprintf(cserr, "set drive_x layout with error2000%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } } else { flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_SET_DRIVE_LAYOUT_EX, // dwIoControlCode (LPVOID) drivelayout_x, // input buffer (DWORD) szNewLayout, // size of input buffer NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) &lpBytesReturned, // number of bytes returned (LPOVERLAPPED) NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"set drive_x layout with error ", GetLastError()); sprintf(cserr, "set drive_x layout with errorxp ro 2003%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } } VERIFY_INFORMATION verify; verify.Length = ((((diskGeometry.Cylinders.QuadPart * diskGeometry.TracksPerCylinder)* diskGeometry.SectorsPerTrack)) * diskGeometry.BytesPerSector); verify.StartingOffset.QuadPart = SYSREVERS_SIZE; flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_VERIFY, // dwIoControlCode (LPVOID) &verify, // input buffer (DWORD) sizeof(VERIFY_INFORMATION), // size of input buffer NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) &lpBytesReturned, // number of bytes returned (LPOVERLAPPED) NULL // OVERLAPPED structure ); if(flag == FALSE) { //PrintWin32Error( L"verify disk with error ", GetLastError()); sprintf(cserr, "verify disk with error %d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } if(osver[0] != '0') { flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_UPDATE_PROPERTIES,// dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD)&lpBytesReturned, // lpBytesReturned (LPOVERLAPPED)NULL // lpOverlapped ); if(flag == FALSE) { sprintf(cserr, "update propertioes with error%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } flag = DeviceIoControl( (HANDLE) volumeHandle, // handle to device IOCTL_DISK_UPDATE_PROPERTIES,// dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD)&lpBytesReturned, // lpBytesReturned (LPOVERLAPPED)NULL // lpOverlapped ); if(flag == FALSE) { //PrintWin32Error( L"update propertioes with error ", GetLastError()); sprintf(cserr, "update propertioes with error%d ", GetLastError()); MessageBox( NULL, cserr, "分区错误提示", MB_OK ); goto error; } } CloseHandle(volumeHandle); delete drivelayout_x; delete temp; return TRUE; error: CloseHandle(volumeHandle); delete drivelayout_x; delete temp; return FALSE; }
------
生活就是工作,工作就是生活--对我来说足以! |
gongyu
一般會員 發表:1 回覆:3 積分:0 註冊:2007-11-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |