Example #1
0
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;
}