请哪位大侠帮忙用C#改写一下VC代码(环境Wince)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;
{
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;
有要引入多个windowsapi,还要定义结构和常量,
不愿意整
你既然知道是要得到什么东西,可以直接用C#去实现这段代码,何必去改写。
改写的时间,你都可以直接把上面代码封装成动态库去调用了
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;
}
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);
兄弟,谢谢,API函数,我都知道。
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;另外这个API我是这样定义的,也不知道对不
[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);