| Index: sandbox/win/tools/finder/finder_fs.cc
|
| diff --git a/sandbox/win/tools/finder/finder_fs.cc b/sandbox/win/tools/finder/finder_fs.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ddcc4bec605ac161a3d6542405f04b98ad6c9300
|
| --- /dev/null
|
| +++ b/sandbox/win/tools/finder/finder_fs.cc
|
| @@ -0,0 +1,117 @@
|
| +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "sandbox/win/src/restricted_token.h"
|
| +#include "sandbox/win/src/restricted_token_utils.h"
|
| +#include "sandbox/win/tools/finder/finder.h"
|
| +
|
| +DWORD Finder::ParseFileSystem(ATL::CString directory) {
|
| + WIN32_FIND_DATA find_data;
|
| + HANDLE find;
|
| +
|
| + //Search for items in the directory.
|
| + ATL::CString name_to_search = directory + L"\\*";
|
| + find = ::FindFirstFile(name_to_search, &find_data);
|
| + if (INVALID_HANDLE_VALUE == find) {
|
| + DWORD error = ::GetLastError();
|
| + Output(FS_ERR, error, directory);
|
| + filesystem_stats_[BROKEN]++;
|
| + return error;
|
| + }
|
| +
|
| + // parse all files or folders.
|
| + do {
|
| + if (_tcscmp(find_data.cFileName, L".") == 0 ||
|
| + _tcscmp(find_data.cFileName, L"..") == 0)
|
| + continue;
|
| +
|
| + ATL::CString complete_name = directory + L"\\" + find_data.cFileName;
|
| + TestFileAccess(complete_name);
|
| +
|
| + // Call recursively the function if the path found is a directory.
|
| + if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
|
| + ParseFileSystem(complete_name);
|
| + }
|
| + } while (::FindNextFile(find, &find_data) != 0);
|
| +
|
| + DWORD err_code = ::GetLastError();
|
| + ::FindClose(find);
|
| +
|
| + if (ERROR_NO_MORE_FILES != err_code) {
|
| + Output(FS_ERR, err_code, directory);
|
| + filesystem_stats_[BROKEN]++;
|
| + return err_code;
|
| + }
|
| +
|
| + return ERROR_SUCCESS;
|
| +}
|
| +
|
| +DWORD Finder::TestFileAccess(ATL::CString name) {
|
| + Impersonater impersonate(token_handle_);
|
| +
|
| + filesystem_stats_[PARSE]++;
|
| +
|
| + HANDLE file;
|
| + if (access_type_ & kTestForAll) {
|
| + file = ::CreateFile(name.GetBuffer(),
|
| + GENERIC_ALL,
|
| + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
| + NULL,
|
| + OPEN_EXISTING,
|
| + FILE_ATTRIBUTE_NORMAL,
|
| + NULL);
|
| +
|
| + if (file != INVALID_HANDLE_VALUE) {
|
| + filesystem_stats_[ALL]++;
|
| + Output(FS, L"R/W", name.GetBuffer());
|
| + ::CloseHandle(file);
|
| + return GENERIC_ALL;
|
| + } else if (::GetLastError() != ERROR_ACCESS_DENIED) {
|
| + Output(FS_ERR, GetLastError(), name);
|
| + filesystem_stats_[BROKEN]++;
|
| + }
|
| + }
|
| +
|
| + if (access_type_ & kTestForWrite) {
|
| + file = ::CreateFile(name.GetBuffer(),
|
| + GENERIC_WRITE,
|
| + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
| + NULL,
|
| + OPEN_EXISTING,
|
| + FILE_ATTRIBUTE_NORMAL,
|
| + NULL);
|
| +
|
| + if (file != INVALID_HANDLE_VALUE) {
|
| + filesystem_stats_[WRITE]++;
|
| + Output(FS, L"W", name);
|
| + ::CloseHandle(file);
|
| + return GENERIC_WRITE;
|
| + } else if (::GetLastError() != ERROR_ACCESS_DENIED) {
|
| + Output(FS_ERR, ::GetLastError(), name);
|
| + filesystem_stats_[BROKEN]++;
|
| + }
|
| + }
|
| +
|
| + if (access_type_ & kTestForRead) {
|
| + file = ::CreateFile(name.GetBuffer(),
|
| + GENERIC_READ,
|
| + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
| + NULL,
|
| + OPEN_EXISTING,
|
| + FILE_ATTRIBUTE_NORMAL,
|
| + NULL);
|
| +
|
| + if (file != INVALID_HANDLE_VALUE) {
|
| + filesystem_stats_[READ]++;
|
| + Output(FS, L"R", name);
|
| + ::CloseHandle(file);
|
| + return GENERIC_READ;
|
| + } else if (::GetLastError() != ERROR_ACCESS_DENIED) {
|
| + Output(FS_ERR, GetLastError(), name);
|
| + filesystem_stats_[BROKEN]++;
|
| + }
|
| + }
|
| +
|
| + return 0;
|
| +}
|
|
|