首页 > C/C++ > VC逻辑路径转化成NT路径
2013
03-18

VC逻辑路径转化成NT路径

//////////////////////////////////////////////////////////////////////////
//功  能:逻辑路径转化成NT路径
//参  数:lpszDevicePath,逻辑路径
//        lpszFilePath,NT路径
//返回值:执行成功,返回TRUE
//////////////////////////////////////////////////////////////////////////
BOOL VolumeDeviceToNtPath(LPCTSTR lpszDevicePath, LPWSTR lpszFilePath)
{
#define BUFSIZE 512
	lpszFilePath[0] = 0x00; 
	// Translate path with device name to drive letters.
	TCHAR szTemp[BUFSIZE];
	szTemp[0] = '\0';

	if (GetLogicalDriveStrings(BUFSIZE-1, szTemp)) 
	{
		TCHAR szName[MAX_PATH];
		TCHAR szDrive[3] = TEXT(" :");
		BOOL bFound = FALSE;
		TCHAR* p = szTemp;

		do 
		{
			// Copy the drive letter to the template string
			*szDrive = *p;

			// Look up each device name
			if (QueryDosDevice(szDrive, szName, MAX_PATH))
			{
				size_t uNameLen = _tcslen(szName);

				if (uNameLen < MAX_PATH) 
				{
					bFound = _tcsnicmp(lpszDevicePath, szName, uNameLen) == 0
						&& *(lpszDevicePath + uNameLen) == _T('\\');

					if (bFound) 
					{
						// Reconstruct pszFilename using szTempFile
						// Replace device path with DOS path
						TCHAR szTempFile[MAX_PATH];
						StringCchPrintf(szTempFile,
							MAX_PATH,
							TEXT("%s%s"),
							szDrive,
							lpszDevicePath+uNameLen);
						StringCchCopyN(lpszFilePath, MAX_PATH+1, szTempFile, _tcslen(szTempFile));
						return TRUE;
					}
				}
			}

			// Go to the next NULL character.
			while (*p++);
		} while (!bFound && *p); // end of string
	}
	return FALSE;
}

调用

//把设备路径转成WINDOWS路径
	WCHAR *chModName = L"\Device\HarddiskVolume1\WINDOWS\system32\rpcrt4.dll";
	WCHAR chBuffer[MAX_PATH*2];
	VolumeDeviceToNtPath(chModName,chBuffer);
	printf("转换后的路径:%s",chBuffer);
运行结果是:
转换后的路径:C:\WINDOWS\system32\rpcrt4.dll
最后编辑:
作者:dnybz
这个作者貌似有点懒,什么都没有留下。