Microsoft Technet Forum の VloumeID ツールと、「http://www.xboxharddrive.com/freeware.html」の「Hard Disk Serial Number Change」ツールを確認しました。ただし、これらのツールは VolumeID の変更のみを提供します。同じPCに存在する可能性のある他の論理ドライブの他のVolumeIDと競合することなく、新しいものを生成する安全な方法はありますか?
質問する
2815 次
1 に答える
4
ボリューム シリアル番号をプログラムで設定することを想定しています。
ボリューム シリアル番号 (VSN) は、現在の日付/時刻に基づいて生成されます。正確な実装の詳細は、OS のバージョンやフォーマットに使用されるツールによって異なる場合があります。
詳細については、次のリンクを参照してください。
Rufus のソース コードから:
/*
* 28.2 CALCULATING THE VOLUME SERIAL NUMBER
*
* For example, say a disk was formatted on 26 Dec 95 at 9:55 PM and 41.94
* seconds. DOS takes the date and time just before it writes it to the
* disk.
*
* Low order word is calculated: Volume Serial Number is:
* Month & Day 12/26 0c1ah
* Sec & Hundrenths 41:94 295eh 3578:1d02
* -----
* 3578h
*
* High order word is calculated:
* Hours & Minutes 21:55 1537h
* Year 1995 07cbh
* -----
* 1d02h
*/
static DWORD GetVolumeID(void)
{
SYSTEMTIME s;
DWORD d;
WORD lo,hi,tmp;
GetLocalTime(&s);
lo = s.wDay + (s.wMonth << 8);
tmp = (s.wMilliseconds/10) + (s.wSecond << 8);
lo += tmp;
hi = s.wMinute + (s.wHour << 8);
hi += s.wYear;
d = lo + (hi << 16);
return d;
}
これは、次の Delphi コードに変換されます。
type
TVolumeId = record
case byte of
0: (Id: DWORD);
1: (
Lo: WORD;
Hi: WORD;
);
end;
function GetVolumeID: DWORD;
var
dtNow: TDateTime;
vlid: TVolumeId;
st: SYSTEMTIME;
begin
GetLocalTime(st);
vlid.Lo := st.wDay + (st.wMonth shl 8);
vlid.Lo := vlid.Lo + (st.wMilliseconds div 10 + (st.wSecond shl 8));
vlid.Hi := st.wMinute + (st.wHour shl 8);
vlid.Hi := vlid.Hi + st.wYear;
Result := vlid.Id
end;
于 2013-03-29T13:55:37.390 に答える