fune/xpcom/io/FileUtilsWin.cpp
Markus Stange 423ce68542 Bug 1462784 - Relabel various other stuff as being OTHER. r=njn
Any more specific work that is happening in these methods will have its own
specific category labeling in that specific code. The instances touched in this
patch are more on the outside and don't really know what kind of code is going
to be running inside.

MozReview-Commit-ID: 47NO1DZzkdH

--HG--
extra : rebase_source : 344c380ddaaf42a1fd820a26b762c61ee9e2d524
2018-05-18 17:58:43 -04:00

75 lines
2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "FileUtilsWin.h"
#include <windows.h>
#include <psapi.h>
#include "mozilla/Unused.h"
#include "nsWindowsHelpers.h"
#include "GeckoProfiler.h"
namespace {
// Scoped type used by HandleToFilename
struct ScopedMappedViewTraits
{
typedef void* type;
static void* empty()
{
return nullptr;
}
static void release(void* aPtr)
{
if (aPtr) {
mozilla::Unused << UnmapViewOfFile(aPtr);
}
}
};
typedef mozilla::Scoped<ScopedMappedViewTraits> ScopedMappedView;
} // namespace
namespace mozilla {
bool
HandleToFilename(HANDLE aHandle, const LARGE_INTEGER& aOffset,
nsAString& aFilename)
{
AUTO_PROFILER_LABEL("HandletoFilename", OTHER);
aFilename.Truncate();
// This implementation is nice because it uses fully documented APIs that
// are available on all Windows versions that we support.
nsAutoHandle fileMapping(CreateFileMapping(aHandle, nullptr, PAGE_READONLY,
0, 1, nullptr));
if (!fileMapping) {
return false;
}
ScopedMappedView view(MapViewOfFile(fileMapping, FILE_MAP_READ,
aOffset.HighPart, aOffset.LowPart, 1));
if (!view) {
return false;
}
nsAutoString mappedFilename;
DWORD len = 0;
SetLastError(ERROR_SUCCESS);
do {
mappedFilename.SetLength(mappedFilename.Length() + MAX_PATH);
len = GetMappedFileNameW(GetCurrentProcess(), view,
mappedFilename.get(),
mappedFilename.Length());
} while (!len && GetLastError() == ERROR_INSUFFICIENT_BUFFER);
if (!len) {
return false;
}
mappedFilename.Truncate(len);
return NtPathToDosPath(mappedFilename, aFilename);
}
} // namespace mozilla