線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4721
推到 Plurk!
推到 Facebook!

在xp下如何同时显示我的U盘的两个分区的盘符????

尚未結案
gongyu
一般會員


發表:1
回覆:3
積分:0
註冊:2007-11-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-29 02:08:36 IP:123.113.xxx.xxx 訂閱
在xp下如何同时显示我的U盘的两个分区的盘符????
大大们,请教了, 我在做U盘加解密这一块,现在就差分区这一块了,分区完了,可是又不能同时显示两个分区的盘符。
boss逼得我都快想跳楼了。郁闷啊。。。。。
------
生活就是工作,工作就是生活--对我来说足以!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-29 10:09:12 IP:61.220.xxx.xxx 訂閱
如果 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-29 10:29:54 IP:61.220.xxx.xxx 訂閱
U盤 是單指 USB 隨身碟 ? 單指 USB 硬碟 ? 泛指 USB 隨身碟 and USB 硬碟 ?
小弟在 [檔案總管] 的 [我的電腦] 按下滑鼠右鍵, 選 [管理]
選 [磁碟管理], 在 USB 隨身碟的 區塊上按下滑鼠右鍵, [刪除磁碟分割] 是 灰色的
在 USB 硬碟的 區塊上按下滑鼠右鍵, [刪除磁碟分割] 是可用的
請問您使用哪套軟體或方法將 USB 隨身碟做分割 ?
     PS: 小弟 USB HD 上很多資料, 不能砍了做測試
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
gongyu
一般會員


發表:1
回覆:3
積分:0
註冊:2007-11-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-29 10:43:21 IP:61.48.xxx.xxx 訂閱
我指的是: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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-29 10:53:56 IP:61.220.xxx.xxx 訂閱
> 我已經實現了在默認時只顯示一個分區的USB隨身碟上分出多個區來
怎麼做的 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
gongyu
一般會員


發表:1
回覆:3
積分:0
註冊:2007-11-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-29 11:01:09 IP:61.48.xxx.xxx 訂閱
回楼上的
自己用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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-29 11:03:09 IP:61.48.xxx.xxx 訂閱
上面的函数可以直接使用,功能:分两个区:
1:2M;
2:4M;
你可以修改分区大小,及分区数
------
生活就是工作,工作就是生活--对我来说足以!
系統時間:2024-04-20 11:58:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!