大家好,向大家请教几个问题:
把锁优盘和移动硬盘的代码用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++) 
}

解决方案 »

  1.   

    这个问题我不会,不过可以给您推荐一个大牛(cnzdgs),他应该熟悉这块。我在做类似工作的时候就是在他耐心的指导下完成的。
      

  2.   


    ////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(); //锁移动存储设备
            }
        }
      

  3.   

    #include <Dbt.h>
    #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;  
    }
      

  4.   

    CreateFile之后是否马上使用CloseHandle?Thread.Sleep(500); 是否可以把时间调小?判断是否本地硬盘部分内容太多,感觉有些内容好像可以去掉
      

  5.   

    //判断硬盘盘符是否为本地硬盘
    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)