111,097
社区成员




unsigned char* GetStorageID(LPCTSTR szDisk)
{
BYTE *SerialNo ;
HANDLE hDisk = CreateFile(szDisk ,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , 0 , NULL);
PSTORAGE_IDENTIFICATION pStoreInfo = (PSTORAGE_IDENTIFICATION) new BYTE[3000];
DWORD dwBytesRet;
if(!DeviceIoControl(hDisk , IOCTL_DISK_GET_STORAGEID, NULL , 0 , pStoreInfo , 3000 , &dwBytesRet , NULL))
{
DWORD err = GetLastError();
delete [] pStoreInfo;
CloseHandle(hDisk);
return FALSE;
}
else
{
SerialNo = (((BYTE *)pStoreInfo) + pStoreInfo->dwManufactureIDOffset);
}
CloseHandle(hDisk);
return SerialNo;
}
#define IOCTL_DISK_GET_STORAGEID CTL_CODE(FILE_DEVICE_DISK, 0x709,METHOD_BUFFERED,FILE_ANY_ACCESS)
typedef struct _STORAGE_IDENTIFICATION
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwManufactureIDOffset;
DWORD dwSerialNumOffset;
} STORAGE_IDENTIFICATION, *PSTORAGE_IDENTIFICATION;
PSTORAGE_IDENTIFICATION pStoreInfo = (PSTORAGE_IDENTIFICATION) new BYTE[3000];
DWORD dwBytesRet;
if(!DeviceIoControl(hDisk , IOCTL_DISK_GET_STORAGEID, NULL , 0 , pStoreInfo , 3000 , &dwBytesRet , NULL))
{
DWORD err = GetLastError();
delete [] pStoreInfo;
CloseHandle(hDisk);
return FALSE;
}
else
{
SerialNo = (((BYTE *)pStoreInfo) + pStoreInfo->dwManufactureIDOffset);
}
CloseHandle(hDisk);
return SerialNo;
[DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
internal static extern int DeviceIoControlCE(
int hDevice,
UInt64 dwIoControlCode,
byte[] lpInBuffer,
int nInBufferSize,
byte[] lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);
[DllImport("kernel32.dll ", EntryPoint = "CreateFile ")]
public static extern int CreateFile(
string lpFileName,
int dwDesiredAccess,
int dwShareMode,
IntPtr lpSecurityAttributes,
int dwCreationDisposition,
int dwFlagsAndAttributes,
int hTemplateFile
);
uint GENERIC_READ = (uint)0x80000000;
uint GENERIC_WRITE = 0x40000000;
int FILE_SHARE_READ = 0x00000001;
int FILE_SHARE_WRITE = 0x00000002;
int OPEN_EXISTING = 3;
//CreateFile可以按下面用
SafeHandle hDisk = CreateFile(szDisk, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, null, OPEN_EXISTING, 0, null);
using System;
public class GlobalMembers
{
public static byte GetStorageID(string szDisk)
{
byte SerialNo = 0;
IntPtr hDisk = CreateFile(szDisk,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, null, OPEN_EXISTING, 0, null);
_STORAGE_IDENTIFICATION[] pStoreInfo = (_STORAGE_IDENTIFICATION)(new byte[3000]);
uint dwBytesRet = 0;
if (! (DeviceIoControl(hDisk, IOCTL_DISK_GET_STORAGEID, null, 0, pStoreInfo, 3000, dwBytesRet, null)))
{
uint err = GetLastError();
pStoreInfo = null;
CloseHandle(hDisk);
return 0;
}
else
{
SerialNo = ((Convert.ToByte(pStoreInfo)) + pStoreInfo.dwManufactureIDOffset);
}
CloseHandle(hDisk);
return SerialNo;
}
}
#define IOCTL_DISK_GET_STORAGEID
public class _STORAGE_IDENTIFICATION
{
public uint dwSize;
public uint dwFlags;
public uint dwManufactureIDOffset;
public uint dwSerialNumOffset;
}