遇到一个应用程序,能自动生成几个虚拟盘,如何取得这几个虚拟盘的盘符??
BOOL CTestManagerApp::GetServiceCfg()
{
CString lstrLetters = m_cfg.GetValue(_T("@service"), _SERVICE_DriverLetters);
lstrLetters.MakeUpper();
m_strDriverLetters.Empty();
for (int i=0;i<lstrLetters.GetLength();i++)
{
if (lstrLetters[i]<=L'Z' && lstrLetters[i]>=L'A')
m_strDriverLetters+=lstrLetters[i];
}
//读取最小可用盘符
m_strMinDriverLetter = m_cfg.GetValue(_T("@service"), _SERVICE_MinDriveLetter);
m_strMinDriverLetter.Trim();
m_strMinDriverLetter.MakeUpper();

return TRUE;
}

解决方案 »

  1.   

    BOOL GetDriveInfo(PARTITION_INFORMATION_EX * PARTITION_INFO)
    {

    BOOL bResult;                 // results flag
    HANDLE hDevice;               // handle to the drive to be examined 
    DWORD junk; hDevice = CreateFile("\\\\.\\c:",  // drive 
    //hDevice = CreateFile("\\.\C:",
                        GENERIC_READ,                // read
        FILE_SHARE_READ| FILE_SHARE_WRITE, 
                        NULL,             // default security attributes
                        OPEN_EXISTING,    // disposition
                        FILE_ATTRIBUTE_NORMAL,                // file attributes
                        NULL);            // do not copy file attributes   if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
      {
      cout<<"create fail!"<<endl;
        return (FALSE);
      }
      bResult = DeviceIoControl(hDevice,  // device to be queried
    IOCTL_DISK_GET_PARTITION_INFO_EX,  // operation to perform
     NULL, 0, // no input buffer
     PARTITION_INFO, 
     sizeof(*PARTITION_INFO),     // output buffer
    &junk,                 // # bytes returned
    (LPOVERLAPPED)NULL);  // synchronous I/O
      CloseHandle(hDevice);
      return (bResult);
    }代码比较乱,上面是获得一个已知盘符的相关信息的代码,里面的函数你查下msdn。
    我当时是要获得盘符的文件类型。
    至于怎么获得盘符,说说你是想根据什么条件来获得盘符?比如说根据一个已经存在的文件。
      

  2.   


    BOOL CMyHook::initHook(void)
    {
    /*
    CStdioFile myFile;

    try
    {
    if (myFile.Open(_T("d:\\Hooklog.txt"),CFile::modeWrite|CFile::shareDenyWrite|CFile::modeCreate))
    {
    myFile.SeekToBegin();
    }
    myFile.Close();
    }
    catch(...)
    {
    }
    */ WriteLog(_T("InitHook"));
    CString str;
    str.Format(_T("hModal=%d"),hModule);
    CMyHook::WriteLog(str);
    InitializeMadCHook();
    //collecting hooks can improve the hook installation performance in win9x
    CollectHooks();
    HookAPI("Kernel32.dll", "CreateFileW",CMyHook::HookCreateFileWCallback,(PVOID*)&CreateFileWNext);
    HookAPI("gdi32.dll", "StartDocW",CMyHook::HookStartDocWCallback,(PVOID*)&StartDocWNext);
    HookAPI("Shell32.DLL", "SHFileOperationW",CMyHook::SHFileOperationWCallback,(PVOID*)&SHFileOperationWNextHook);
    FlushHooks();
    // 读取当前挂接的虚拟磁盘盘符
    CString strPath;
    CString strValue;
    strPath.GetBuffer(MAX_PATH);
    GetSystemDirectory((LPSTR)(LPCTSTR)strPath, MAX_PATH);
    strPath.ReleaseBuffer();
    strPath+=_T(DEF_SETTING_FILE);
    strValue.GetBuffer(MAX_PATH);
    GetPrivateProfileString(_T("@service"),_T("DriverLetters"), _T("-"),(LPSTR)(LPCTSTR)strValue,MAX_PATH,strPath);
    strValue.ReleaseBuffer();
    if (strValue[0] != '-')
    {
    //解析各个盘符
    for(int i=0;i<strValue.GetLength();i++)
    {
    if ('A'<=strValue[i] && 'Z'>=strValue[i])
    driverLetters.Add(CString(strValue[i]));
    }
    }
    // 读取当前用户名
    szUser.GetBuffer(MAX_PATH);
    GetPrivateProfileString(_T("@service"),_T("user"), _T("-"),(LPSTR)(LPCTSTR)szUser,MAX_PATH,strPath);
    szUser.ReleaseBuffer();
    if (szUser[0] == '-')
    szUser=_T("");
    return TRUE;
    }这个是初始化HOOK,之类的
    BOOL CTestManagerApp::GetServiceCfg()
    {
    CString lstrLetters = m_cfg.GetValue(_T("@service"), _SERVICE_DriverLetters);
    lstrLetters.MakeUpper();
    m_strDriverLetters.Empty();
    for (int i=0;i<lstrLetters.GetLength();i++)
    {
    if (lstrLetters[i]<=L'Z' && lstrLetters[i]>=L'A')
    m_strDriverLetters+=lstrLetters[i];
    }
    //读取最小可用盘符
    m_strMinDriverLetter = m_cfg.GetValue(_T("@service"), _SERVICE_MinDriveLetter);
    m_strMinDriverLetter.Trim();
    m_strMinDriverLetter.MakeUpper();

    return TRUE;
    }
    取得虚拟盘配置信息。
    HANDLE WINAPI CMyHook::HookCreateFileWCallback(
      LPCWSTR lpFileName,
      DWORD dwDesiredAccess,
      DWORD dwShareMode,
      LPSECURITY_ATTRIBUTES lpSecurityAttributes,
      DWORD dwCreationDisposition,
      DWORD dwFlagsAndAttributes,
      HANDLE hTemplateFile)
    {  
    BOOL bValid = TRUE;
    CString strName;
    CString strValue;
    strName=lpFileName;
    strName.MakeUpper();
    strName.TrimRight();
    if (strName.Find(_T(".DOC"))>0 || strName.Find(_T(".XLS"))>0 || strName.Find(_T(".PPT"))>0 || strName.Find(_T(".MPP"))>0 ||
     strName.Find(_T(".PDF"))>0 || strName.Find(_T(".BMP"))>0 )
    {    
    //strName=GetServiceCfg(strValue);
    if ( (strName[0] == 'I' ||  strName[0] == 'J') && strName.GetLength()>5)

    WriteLog(_T("CreateFile"));
    WriteLog(strName);
    bValid=isValid();
    }
    }
    if(bValid)
    return CreateFileWNext(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
    else
    return NULL;
    }
    我是要把if ( (strName[0] == 'I' || strName[0] == 'J') && strName.GetLength()>5) 用自动生成的盘符能够代替,应该怎么弄?