- #include
- #include
- #include
-
- #ifdef _UNICODE
- using _tstring = std::wstring;
- #else
- using _tstring = std::string;
- #endif
-
- _tstring DosPathToNtPath(const _tstring& strPath)
- {
- _tstring strResultPath;
- TCHAR szDriveStrings[MAX_PATH] = { 0 };
- TCHAR szDosBuf[MAX_PATH] = { 0 };
- TCHAR szResultBuf[MAX_PATH] = { 0 };
- LPTSTR pDriveStr = NULL;
-
- // 获取盘符名到缓冲
- if (::GetLogicalDriveStrings(_countof(szDriveStrings), szDriveStrings))
- {
- // 遍历盘符名
- for (int i = 0; i < _countof(szDriveStrings); i += 4)
- {
- pDriveStr = &szDriveStrings[i];
- pDriveStr[2] = _T('\0');
-
- // 查询盘符对应的DOS设备名称
- if (!::QueryDosDevice(pDriveStr, szDosBuf, _countof(szDosBuf)))
- {
- break;
- }
-
- // 对比路径前缀
- size_t nLen = _tcslen(szDosBuf);
- if (0 == _tcsnicmp(strPath.c_str(), szDosBuf, nLen))
- {
- lstrcpy(szResultBuf, pDriveStr);
- lstrcat(szResultBuf, strPath.c_str() + nLen);
- strResultPath = szResultBuf;
- break;
- }
- }
- }
-
- return strResultPath;
- }
-
- _tstring NtPathToDosPath(const _tstring& strPath)
- {
- _tstring strResultPath;
- TCHAR szDriveStrings[MAX_PATH] = { 0 };
- TCHAR szDosBuf[MAX_PATH] = { 0 };
- TCHAR szResultBuf[MAX_PATH] = { 0 };
- LPTSTR pDriveStr = NULL;
-
- // 获取盘符名到缓冲
- if (::GetLogicalDriveStrings(_countof(szDriveStrings), szDriveStrings))
- {
- // 遍历盘符名
- for (int i = 0; i < _countof(szDriveStrings); i += 4)
- {
- pDriveStr = &szDriveStrings[i];
- pDriveStr[2] = _T('\0');
-
- // 查询盘符对应的DOS设备名称
- if (!::QueryDosDevice(pDriveStr, szDosBuf, _countof(szDosBuf)))
- {
- break;
- }
-
- // 对比路径前缀
- size_t nLen = _tcslen(pDriveStr);
- if (0 == _tcsnicmp(strPath.c_str(), pDriveStr, nLen))
- {
- lstrcpy(szResultBuf, szDosBuf);
- lstrcat(szResultBuf, strPath.c_str() + nLen);
- strResultPath = szResultBuf;
- break;
- }
- }
- }
-
- return strResultPath;
- }
-
- int main()
- {
- TCHAR szCurPath[MAX_PATH] = { 0 };
- ::GetModuleFileName(NULL, szCurPath, _countof(szCurPath));
-
- _tstring strDosPath;
- _tstring strNtPath = szCurPath;
-
- strDosPath = NtPathToDosPath(strNtPath);
- strNtPath = DosPathToNtPath(strDosPath);
-
- return 0;
- }
-
