遇到一个应用程序,能自动生成几个虚拟盘,如何取得这几个虚拟盘的盘符??
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;
}
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;
}
{
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。
我当时是要获得盘符的文件类型。
至于怎么获得盘符,说说你是想根据什么条件来获得盘符?比如说根据一个已经存在的文件。
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) 用自动生成的盘符能够代替,应该怎么弄?