static DWORD _ScanFileIds(const std::wstring VolumeName, CFileSystemObject & Root) { HANDLE volumeHandle = NULL; unsigned int i = 0; BY_HANDLE_FILE_INFORMATION bhfi; HANDLE fileHandle = INVALID_HANDLE_VALUE; DWORD ret = ERROR_GEN_FAILURE; volumeHandle = CreateFileW(VolumeName.c_str(), FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ret = (volumeHandle != INVALID_HANDLE_VALUE) ? ERROR_SUCCESS : GetLastError(); if (ret == ERROR_SUCCESS) { for (i = 0; i < 16 * 1024 * 1024; ++i) { ret = _OpenFileById(volumeHandle, i, &fileHandle); if (ret == ERROR_SUCCESS) { POBJECT_NAME_INFORMATION oni = NULL; ret = (GetFileInformationByHandle(fileHandle, &bhfi)) ? ERROR_SUCCESS : GetLastError(); if (ret == ERROR_SUCCESS) { ret = QueryObjectName(fileHandle, &oni); if (ret == ERROR_SUCCESS) { CFileSystemObject *o = NULL; std::wstring fileName = std::wstring(oni->Name.Buffer, oni->Name.Length / sizeof(WCHAR)).substr(1); size_t pos = fileName.find_first_of(L'\\'); fileName = fileName.substr(pos + 1); pos = fileName.find_first_of(L'\\'); fileName = fileName.substr(pos + 1); o = new CFileSystemObject(L"", bhfi.dwFileAttributes, i); Root.AddObject(fileName, o); HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, oni); } } CloseHandle(fileHandle); } } CloseHandle(volumeHandle); } return ret; }