大家好,向大家请教几个问题:
把锁优盘和移动硬盘的代码用MFC封装成DLL,
用C#在WindowsService环境下定时来调用锁盘的方法(回调函数不好直接用);
现在碰到一些奇怪的问题:
----------------------
(1)先开启服务,再插入移动硬盘,移动硬盘的两个盘符都锁不住,偶尔能锁一个盘符;
但是先插入移动硬盘,再启动服务,两个盘符都可以锁住;
之前还碰到单步调试时,两个盘符都可以锁住,但是直接运行就只能锁一个盘符;
----------------------
(2)先开启服务,然后再分别插入两个优盘,也可以锁住;
但是如果优盘两个盘符分别是H,I,如何先插入I盘,再插入H盘,H盘就锁不住;
停止服务,两个盘都拿下来之后,有时也会出现两个盘符都锁不住;感觉问题有些奇怪,不知道是定时锁盘的时间设置问题,还是资源释放问题,
请大家看下代码,帮忙提下建议,谢谢
----------------------//C++ Code
void DisableUSB() //查找移动存储设备并加锁
{
HANDLE hDevice;
DWORD dwOutBytes;
bool bResult;
bool lock_flag = false;
CString logicalDisk;
CString tmpdir;
bool is_ide = true;
bool find_usbdisk = false;
char tmp;
char *ptmpDir; DWORD dwDrvs = GetLogicalDrives();
for (int i=0; i <26; i++)
{
if (dwDrvs & (1<<i))
{
tmpdir.Format(L"%c:",('A'+i)); if (tmpdir != "")
{
if(GetDriveType((LPCTSTR)tmpdir)==DRIVE_REMOVABLE) //获取U盘的盘符
{
logicalDisk = L"\\\\.\\"+tmpdir;
hDevice = CreateFile(
logicalDisk, //驱动器名称
GENERIC_READ|GENERIC_WRITE, //打开方式
FILE_SHARE_READ|FILE_SHARE_WRITE, //共享方式
NULL, //安全描述符指针
OPEN_EXISTING, //创建方式
0, //文件属性及标志
NULL //模板文件的句柄
);
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL);
}
else if(GetDriveType((LPCTSTR)tmpdir)==DRIVE_FIXED) //获取USB移动硬盘的盘符
{
//判断该盘符是否为USB盘符
ptmpDir = new char[tmpdir.GetLength() +1];
strcpy(ptmpDir,(const char*)tmpdir.GetBuffer());
is_ide = IsIDE(ptmpDir);
delete ptmpDir; if (is_ide == false) //不是本地硬盘
{
logicalDisk = L"\\\\.\\"+tmpdir;
hDevice = CreateFile(
logicalDisk, //驱动器名称
GENERIC_READ|GENERIC_WRITE, //打开方式
FILE_SHARE_READ|FILE_SHARE_WRITE, //共享方式
NULL, //安全描述符指针
OPEN_EXISTING, //创建方式
0, //文件属性及标志
NULL //模板文件的句柄
);
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL); tmpdir.Format(L"%c:",('A'+i+1)); //锁相邻的下一个盘符
logicalDisk = L"\\\\.\\"+tmpdir;
hDevice = CreateFile(
logicalDisk, //驱动器名称
GENERIC_READ|GENERIC_WRITE, //打开方式
FILE_SHARE_READ|FILE_SHARE_WRITE, //共享方式
NULL, //安全描述符指针
OPEN_EXISTING, //创建方式
0, //文件属性及标志
NULL //模板文件的句柄
);
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL);
}
} //end of if (tmpdir != "")
} //end of if (tmpdir != "")
} //end of if (dwDrvs & (1<<i))
} //end of for (int i=0; i <26; i++)
}
把锁优盘和移动硬盘的代码用MFC封装成DLL,
用C#在WindowsService环境下定时来调用锁盘的方法(回调函数不好直接用);
现在碰到一些奇怪的问题:
----------------------
(1)先开启服务,再插入移动硬盘,移动硬盘的两个盘符都锁不住,偶尔能锁一个盘符;
但是先插入移动硬盘,再启动服务,两个盘符都可以锁住;
之前还碰到单步调试时,两个盘符都可以锁住,但是直接运行就只能锁一个盘符;
----------------------
(2)先开启服务,然后再分别插入两个优盘,也可以锁住;
但是如果优盘两个盘符分别是H,I,如何先插入I盘,再插入H盘,H盘就锁不住;
停止服务,两个盘都拿下来之后,有时也会出现两个盘符都锁不住;感觉问题有些奇怪,不知道是定时锁盘的时间设置问题,还是资源释放问题,
请大家看下代码,帮忙提下建议,谢谢
----------------------//C++ Code
void DisableUSB() //查找移动存储设备并加锁
{
HANDLE hDevice;
DWORD dwOutBytes;
bool bResult;
bool lock_flag = false;
CString logicalDisk;
CString tmpdir;
bool is_ide = true;
bool find_usbdisk = false;
char tmp;
char *ptmpDir; DWORD dwDrvs = GetLogicalDrives();
for (int i=0; i <26; i++)
{
if (dwDrvs & (1<<i))
{
tmpdir.Format(L"%c:",('A'+i)); if (tmpdir != "")
{
if(GetDriveType((LPCTSTR)tmpdir)==DRIVE_REMOVABLE) //获取U盘的盘符
{
logicalDisk = L"\\\\.\\"+tmpdir;
hDevice = CreateFile(
logicalDisk, //驱动器名称
GENERIC_READ|GENERIC_WRITE, //打开方式
FILE_SHARE_READ|FILE_SHARE_WRITE, //共享方式
NULL, //安全描述符指针
OPEN_EXISTING, //创建方式
0, //文件属性及标志
NULL //模板文件的句柄
);
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL);
}
else if(GetDriveType((LPCTSTR)tmpdir)==DRIVE_FIXED) //获取USB移动硬盘的盘符
{
//判断该盘符是否为USB盘符
ptmpDir = new char[tmpdir.GetLength() +1];
strcpy(ptmpDir,(const char*)tmpdir.GetBuffer());
is_ide = IsIDE(ptmpDir);
delete ptmpDir; if (is_ide == false) //不是本地硬盘
{
logicalDisk = L"\\\\.\\"+tmpdir;
hDevice = CreateFile(
logicalDisk, //驱动器名称
GENERIC_READ|GENERIC_WRITE, //打开方式
FILE_SHARE_READ|FILE_SHARE_WRITE, //共享方式
NULL, //安全描述符指针
OPEN_EXISTING, //创建方式
0, //文件属性及标志
NULL //模板文件的句柄
);
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL); tmpdir.Format(L"%c:",('A'+i+1)); //锁相邻的下一个盘符
logicalDisk = L"\\\\.\\"+tmpdir;
hDevice = CreateFile(
logicalDisk, //驱动器名称
GENERIC_READ|GENERIC_WRITE, //打开方式
FILE_SHARE_READ|FILE_SHARE_WRITE, //共享方式
NULL, //安全描述符指针
OPEN_EXISTING, //创建方式
0, //文件属性及标志
NULL //模板文件的句柄
);
bResult = DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL);
}
} //end of if (tmpdir != "")
} //end of if (tmpdir != "")
} //end of if (dwDrvs & (1<<i))
} //end of for (int i=0; i <26; i++)
}
解决方案 »
- 有没有人碰到过这种问题,socket方面的
- 改变CListCtrl列表头的背景颜色
- 关于子对话框返回母对话框的问题?
- 谁知道TCP/IP详解卷二中提供的源代码怎样运行啊,是不是必须在UNIX下
- 高手请进:打开位图预览对话框中,我用文本来显示文件大小。1,如何使文本显示成黄色 2,在打开位图文件之前,如何让它显示先前打开的位
- 请教一个问题,大家帮忙看看
- arvid_gs(west)领分啦...........................................................................
- 100分请教:各位高手,如何利用vc++来绘画希腊字符,或着使用以有的希腊字库?
- 请问后缀名为wab、mso、xml、mbx、eml分别是什么文件,用什么打开或编辑?
- 请问VC DLL中对话框的一个问题
- 如何实现:如帖左侧头像处,鼠标滑过,显示一个新对话框,移开消失?
- xeex.exe 病毒引发的思考
////WindowsService下C# Codepublic partial class Srv_USBMNG : ServiceBase
{
[DllImport("LockUSB.dll")]
public static extern void DisableUSB(); //锁移动存储设备 [DllImport("LockUSB.dll")]
public static extern bool IsIDE(string str); //判断是否为本地硬盘 public Srv_USBMNG()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
//每间隔0。5秒调用一次DeviceIOControl
for (int i = 0; i < 1; )
{
//等待时间不知道设置多少最合适?
Thread.Sleep(500); Thread thrd1 = new Thread(new ThreadStart(USBScan));
thrd1.Start();
}
} protected override void OnStop()
{ } private void USBScan()
{
DisableUSB(); //锁移动存储设备
}
}
#include <Winioctl.h>
using namespace std;bool IsIDE(char* pDriveName) //判断是否为本地硬盘
{
///本段程序的前提是DriveName是已经过GetDriveType的判断是本地磁盘,否则报错,作用是判断是否是真正的本地磁盘
CString DriveName;
HANDLE hDeviceDest = NULL;
DWORD nBytesRead = 0;//预设为0,当缓冲区的长度不够时,该值为所需的缓冲区的长度
DWORD nBufferSize = sizeof(PARTITION_INFORMATION);
PPARTITION_INFORMATION lpPartInfo=(PPARTITION_INFORMATION)malloc(nBufferSize);
if(lpPartInfo == NULL)
{
return false;
}
memset(lpPartInfo, 0, nBufferSize);//将缓冲区lpPartInfo的内容设为nDiskBufferSize个NULL
//CString DriveName="J:";//为判断提供接口
DriveName.Format(L"%c:",*pDriveName);
DriveName=L"\\\\.\\"+DriveName;
hDeviceDest = CreateFile(LPCTSTR(DriveName),
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hDeviceDest == NULL)
{
return false;
} //获得该分区信息
BOOL ret1=DeviceIoControl(
hDeviceDest,
IOCTL_DISK_GET_PARTITION_INFO,
NULL,
0,
(LPVOID) lpPartInfo,
(DWORD) nBufferSize,
(LPDWORD) &nBytesRead,
NULL //指向一个异步的结构体
);
if(!ret1)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language
(LPTSTR)&lpMsgBuf,
0,
NULL
);
LocalFree(lpMsgBuf);
return false;
} // end of if(!ret1) //导出该分区信息
LARGE_INTEGER StartingOffset=lpPartInfo->StartingOffset;
LONGLONG QuadPart=StartingOffset.QuadPart; //取上面的值之一情形,支持64位整型
LARGE_INTEGER PartitionLength=lpPartInfo->PartitionLength;
LONGLONG QuadPart1=PartitionLength.QuadPart; //取上面的值之一情形,支持64位整型
DWORD HiddenSectors=lpPartInfo->HiddenSectors;
DWORD PartitionNumber=lpPartInfo->PartitionNumber;
BYTE PartitionType=lpPartInfo->PartitionType;
BOOLEAN BootIndicator=lpPartInfo->BootIndicator;
BOOLEAN RecognizedPartition=lpPartInfo->RecognizedPartition;
BOOLEAN RewritePartition=lpPartInfo->RewritePartition;
free(lpPartInfo);
CloseHandle(hDeviceDest);
//查询注册表中COUNT(Disk)的值
UINT IDESeqNum;//IDE的序号
BOOL FindIDE = false;
HKEY hKEY;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum", 0, KEY_READ, &hKEY);
///////////接收DWORD型/////////////
DWORD Type;//仅仅用于接收数据类型
DWORD dwValue;
DWORD dwBufLen = sizeof(DWORD);
long ret2=::RegQueryValueEx(hKEY,_T("Count"), NULL, &Type,(BYTE*)&dwValue,&dwBufLen); if(ret2!=ERROR_SUCCESS)
{
return FALSE;//失败
} for(UINT k=0; k<dwValue; k++)
{
///////////接收字符型/////////////
char str[256];
DWORD sl = 256;
CString nDisk;
nDisk.Format(L"%u",k);
RegQueryValueEx(hKEY, nDisk, NULL, NULL, (LPBYTE)str, &sl);
//注意第三项必须设为NULL,否则接收到的字符数据出错
CString temp=(LPCTSTR)str; if (temp.Left(3) == "IDE")
{
IDESeqNum=k; //IDE的序号
FindIDE=TRUE;
}
} //end of for(UINT k=0; k<dwValue; k++) if (!FindIDE)
return false; //IDESeqNum=0;
RegCloseKey(hKEY);
CString temp;
temp.Format(L"%u",IDESeqNum);
temp=L"\\\\.\\PHYSICALDRIVE"+temp;//为下一步检测作准备
HANDLE hDevice = NULL;
DWORD nDiskBytesRead = 0; //预设为0,当缓冲区的长度不够时,该值为所需的缓冲区的长度
DWORD nDiskBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION)*104;//26*4
PDRIVE_LAYOUT_INFORMATION lpDiskPartInfo = (PDRIVE_LAYOUT_INFORMATION)malloc(nDiskBufferSize);
if(lpDiskPartInfo == NULL)
{
return FALSE;
}
memset(lpDiskPartInfo, 0, nDiskBufferSize);//将缓冲区lpDiskPartInfo的内容设为nDiskBufferSize个NULL
//获得所有分区的信息
hDevice = CreateFile(LPCTSTR(temp),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0, NULL);
if(hDevice == NULL)
{
return FALSE;
}
/////////////获得某磁盘上的所有分区信息/////////////////////////
BOOL ret=DeviceIoControl(
hDevice,
IOCTL_DISK_GET_DRIVE_LAYOUT,
NULL,
0,
(LPVOID) lpDiskPartInfo,
(DWORD) nDiskBufferSize,
(LPDWORD) &nDiskBytesRead,
NULL
);
if (!ret)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
LocalFree(lpMsgBuf);
return FALSE;
} //end of if (!ret)
//} //end of bool CusbmngDlg::IsIDE(CString DriveName) //////////////////////////////导出分区信息///////////////////////////////////////
DWORD PartitionCount=lpDiskPartInfo->PartitionCount;
//永远是实际的分区数的4倍,不能用的分区将会显示类型PARTITION_ENTRY_UNUSED,即分区类型为0
//依次获取导出某分区信息,并与目的驱动器进行比较///////////////////////////////////
for(UINT i=0; i<PartitionCount; i=i+4)//+4是因为只有下标为4的整数倍的值才是正确的引用
{
PARTITION_INFORMATION DiskPartInfo=lpDiskPartInfo->PartitionEntry[i];//0为C:,4为D:,8为e:,12为F
LARGE_INTEGER DiskStartingOffset = DiskPartInfo.StartingOffset;
LONGLONG DiskQuadPart = DiskStartingOffset.QuadPart; //取上面的值之一情形,支持64位整型
LARGE_INTEGER DiskPartitionLength = DiskPartInfo.PartitionLength;
LONGLONG DiskQuadPart1 = DiskPartitionLength.QuadPart; //取上面的值之一情形,支持64位整型
DWORD DiskHiddenSectors = DiskPartInfo.HiddenSectors;
DWORD DiskPartitionNumber = DiskPartInfo.PartitionNumber;
BYTE DiskPartitionType = DiskPartInfo.PartitionType;
BOOLEAN DiskBootIndicator = DiskPartInfo.BootIndicator;
BOOLEAN DiskRecognizedPartition = DiskPartInfo.RecognizedPartition;
BOOLEAN DiskRewritePartition = DiskPartInfo.RewritePartition; if ((DiskQuadPart==QuadPart) && (DiskQuadPart1==QuadPart1)
&& (DiskHiddenSectors==HiddenSectors) && (DiskPartitionNumber==PartitionNumber)
&& (DiskPartitionType==PartitionType ) && (DiskBootIndicator==BootIndicator)
&& (DiskRecognizedPartition==RecognizedPartition) && (DiskRewritePartition==RewritePartition))
{
free(lpDiskPartInfo);
CloseHandle(hDevice);
return TRUE;
} //end of if
} //end of for(UINT i=0; i<PartitionCount; i=i+4)
free(lpDiskPartInfo);
CloseHandle(hDevice);
return false;
}
bool CusbmngDlg::IsIDE(CString DriveName)
{
///本段程序的前提是DriveName是已经过GetDriveType的判断是本地磁盘,否则报错,作用是判断是否是真正的本地磁盘
HANDLE hDeviceDest = NULL;
DWORD nBytesRead = 0;//预设为0,当缓冲区的长度不够时,该值为所需的缓冲区的长度
DWORD nBufferSize = sizeof(PARTITION_INFORMATION);
PPARTITION_INFORMATION lpPartInfo=(PPARTITION_INFORMATION)malloc(nBufferSize);
if(lpPartInfo == NULL)
{
return false;
}
memset(lpPartInfo, 0, nBufferSize);//将缓冲区lpPartInfo的内容设为nDiskBufferSize个NULL
//CString DriveName="J:";//为判断提供接口
DriveName=L"\\\\.\\"+DriveName;
hDeviceDest = CreateFile(LPCTSTR(DriveName),
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hDeviceDest == NULL)
{
return false;
} //获得该分区信息
BOOL ret1=DeviceIoControl(
hDeviceDest,
IOCTL_DISK_GET_PARTITION_INFO,
NULL,
0,
(LPVOID) lpPartInfo,
(DWORD) nBufferSize,
(LPDWORD) &nBytesRead,
NULL //指向一个异步的结构体
);
if(!ret1)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language
(LPTSTR)&lpMsgBuf,
0,
NULL
);
LocalFree(lpMsgBuf);
return false;
} // end of if(!ret1) //导出该分区信息
LARGE_INTEGER StartingOffset=lpPartInfo->StartingOffset;
LONGLONG QuadPart=StartingOffset.QuadPart; //取上面的值之一情形,支持64位整型
LARGE_INTEGER PartitionLength=lpPartInfo->PartitionLength;
LONGLONG QuadPart1=PartitionLength.QuadPart; //取上面的值之一情形,支持64位整型
DWORD HiddenSectors=lpPartInfo->HiddenSectors;
DWORD PartitionNumber=lpPartInfo->PartitionNumber;
BYTE PartitionType=lpPartInfo->PartitionType;
BOOLEAN BootIndicator=lpPartInfo->BootIndicator;
BOOLEAN RecognizedPartition=lpPartInfo->RecognizedPartition;
BOOLEAN RewritePartition=lpPartInfo->RewritePartition;
free(lpPartInfo);
CloseHandle(hDeviceDest);
//查询注册表中COUNT(Disk)的值
UINT IDESeqNum;//IDE的序号
BOOL FindIDE = false;
HKEY hKEY;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum", 0, KEY_READ, &hKEY);
///////////接收DWORD型/////////////
DWORD Type;//仅仅用于接收数据类型
DWORD dwValue;
DWORD dwBufLen = sizeof(DWORD);
long ret2=::RegQueryValueEx(hKEY,_T("Count"), NULL, &Type,(BYTE*)&dwValue,&dwBufLen); if(ret2!=ERROR_SUCCESS)
{
return FALSE;//失败
} for(UINT k=0; k<dwValue; k++)
{
///////////接收字符型/////////////
char str[256];
DWORD sl = 256;
CString nDisk;
nDisk.Format(L"%u",k);
RegQueryValueEx(hKEY, nDisk, NULL, NULL, (LPBYTE)str, &sl);
//注意第三项必须设为NULL,否则接收到的字符数据出错
CString temp=(LPCTSTR)str; if (temp.Left(3) == "IDE")
{
IDESeqNum=k; //IDE的序号
FindIDE=TRUE;
}
} //end of for(UINT k=0; k<dwValue; k++) if (!FindIDE)
return false; //IDESeqNum=0;
RegCloseKey(hKEY);
CString temp;
temp.Format(L"%u",IDESeqNum);
temp=L"\\\\.\\PHYSICALDRIVE"+temp;//为下一步检测作准备
HANDLE hDevice = NULL;
DWORD nDiskBytesRead = 0; //预设为0,当缓冲区的长度不够时,该值为所需的缓冲区的长度
DWORD nDiskBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION)*104;//26*4
PDRIVE_LAYOUT_INFORMATION lpDiskPartInfo = (PDRIVE_LAYOUT_INFORMATION)malloc(nDiskBufferSize);
if(lpDiskPartInfo == NULL)
{
return FALSE;
}
memset(lpDiskPartInfo, 0, nDiskBufferSize);//将缓冲区lpDiskPartInfo的内容设为nDiskBufferSize个NULL
//获得所有分区的信息
hDevice = CreateFile(LPCTSTR(temp),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
0, NULL);
if(hDevice == NULL)
{
return FALSE;
}
/////////////获得某磁盘上的所有分区信息/////////////////////////
BOOL ret=DeviceIoControl(
hDevice,
IOCTL_DISK_GET_DRIVE_LAYOUT,
NULL,
0,
(LPVOID) lpDiskPartInfo,
(DWORD) nDiskBufferSize,
(LPDWORD) &nDiskBytesRead,
NULL
);
if (!ret)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
LocalFree(lpMsgBuf);
return FALSE;
} //end of if (!ret)
//} //end of bool CusbmngDlg::IsIDE(CString DriveName) ////////////////////////////导出分区信息///////////////////////////////////////
DWORD PartitionCount=lpDiskPartInfo->PartitionCount;
//永远是实际的分区数的4倍,不能用的分区将会显示类型PARTITION_ENTRY_UNUSED,即分区类型为0
//依次获取导出某分区信息,并与目的驱动器进行比较///////////////////////////////////
for(UINT i=0; i<PartitionCount; i=i+4)//+4是因为只有下标为4的整数倍的值才是正确的引用
{
PARTITION_INFORMATION DiskPartInfo=lpDiskPartInfo->PartitionEntry[i];//0为C:,4为D:,8为e:,12为F
LARGE_INTEGER DiskStartingOffset = DiskPartInfo.StartingOffset;
LONGLONG DiskQuadPart = DiskStartingOffset.QuadPart; //取上面的值之一情形,支持64位整型
LARGE_INTEGER DiskPartitionLength = DiskPartInfo.PartitionLength;
LONGLONG DiskQuadPart1 = DiskPartitionLength.QuadPart; //取上面的值之一情形,支持64位整型
DWORD DiskHiddenSectors = DiskPartInfo.HiddenSectors;
DWORD DiskPartitionNumber = DiskPartInfo.PartitionNumber;
BYTE DiskPartitionType = DiskPartInfo.PartitionType;
BOOLEAN DiskBootIndicator = DiskPartInfo.BootIndicator;
BOOLEAN DiskRecognizedPartition = DiskPartInfo.RecognizedPartition;
BOOLEAN DiskRewritePartition = DiskPartInfo.RewritePartition; if ((DiskQuadPart==QuadPart) && (DiskQuadPart1==QuadPart1)
&& (DiskHiddenSectors==HiddenSectors) && (DiskPartitionNumber==PartitionNumber)
&& (DiskPartitionType==PartitionType ) && (DiskBootIndicator==BootIndicator)
&& (DiskRecognizedPartition==RecognizedPartition) && (DiskRewritePartition==RewritePartition))
{
free(lpDiskPartInfo);
CloseHandle(hDevice);
return TRUE;
} //end of if
} //end of for(UINT i=0; i<PartitionCount; i=i+4)
free(lpDiskPartInfo);
CloseHandle(hDevice);
return false;
} //end of IsIDE(CString DriveName)