d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/* $Id$ */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/** @file
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * VirtualBox Windows Guest Shared Folders - Windows 2000 Hacks.
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/*
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * Copyright (C) 2012 Oracle Corporation
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync *
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * available from http://www.virtualbox.org. This file is free software;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * you can redistribute it and/or modify it under the terms of the GNU
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * General Public License (GPL) as published by the Free Software
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/*******************************************************************************
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync* Header Files *
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync*******************************************************************************/
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#define FsRtlTeardownPerStreamContexts FsRtlTeardownPerStreamContexts_AvoidIt
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#define RtlGetVersion RtlGetVersion_AvoidIt
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#define PsGetProcessImageFileName PsGetProcessImageFileName_AvoidIt
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#include "vbsf.h"
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#include <iprt/asm.h>
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#if 0
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/*
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * FsRtlTeardownPerStreamContexts.
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic VOID __stdcall Resolve_FsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic volatile PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS g_pfnFsRtlTeardownPerStreamContexts = Resolve_FsRtlTeardownPerStreamContexts;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic VOID __stdcall Fake_FsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER pAdvancedHeader)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PLIST_ENTRY pCur;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync ExAcquireFastMutex(pAdvancedHeader->FastMutex);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pCur = pAdvancedHeader->FilterContexts.Flink;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync while (pCur != &pAdvancedHeader->FilterContexts)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync {
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PLIST_ENTRY pNext = pCur->Flink;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PFSRTL_PER_STREAM_CONTEXT pCtx = CONTAINING_RECORD(pCur, FSRTL_PER_STREAM_CONTEXT, Links);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Fake_FsRtlTeardownPerStreamContexts: %p\n", pCtx));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pCtx->FreeCallback(pCtx);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pCur = pNext;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync }
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync InitializeListHead(&pAdvancedHeader->FilterContexts);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync ExReleaseFastMutex(pAdvancedHeader->FastMutex);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic VOID __stdcall Resolve_FsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER pAdvancedHeader)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync UNICODE_STRING RoutineName;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS pfn;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Resolve_FsRtlTeardownPerStreamContexts: %p\n", pAdvancedHeader));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync RtlInitUnicodeString(&RoutineName, L"KeIpiGenericCall");
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn = (PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS)MmGetSystemRoutineAddress(&RoutineName);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync if (!pfn)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn = Fake_FsRtlTeardownPerStreamContexts;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync ASMAtomicWritePtr(&g_pfnFsRtlTeardownPerStreamContexts, pfn);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn(pAdvancedHeader);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#undef FsRtlTeardownPerStreamContexts
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync__declspec(dllexport) VOID
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncFsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER pAdvancedHeader)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("FsRtlTeardownPerStreamContexts: %p\n", pAdvancedHeader));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync g_pfnFsRtlTeardownPerStreamContexts(pAdvancedHeader);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("FsRtlTeardownPerStreamContexts: returns\n"));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#endif
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/*
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * RtlGetVersion
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsynctypedef NTSTATUS (__stdcall * PFNRTLGETVERSION)(PRTL_OSVERSIONINFOW);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic NTSTATUS __stdcall Resolve_RtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic volatile PFNRTLGETVERSION g_pfnRtlGetVersion = Resolve_RtlGetVersion;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic NTSTATUS __stdcall Fake_RtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Fake_RtlGetVersion: %p\n", pVerInfo));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync if (pVerInfo->dwOSVersionInfoSize < sizeof(*pVerInfo))
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync {
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Fake_RtlGetVersion: -> STATUS_INVALID_PARAMETER (size = %#x)\n", pVerInfo->dwOSVersionInfoSize));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return STATUS_INVALID_PARAMETER;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync }
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync /* Report Windows 2000 w/o SP. */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfo->dwMajorVersion = 5;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfo->dwMinorVersion = 0;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfo->dwBuildNumber = 2195;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfo->dwPlatformId = VER_PLATFORM_WIN32_NT;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfo->szCSDVersion[0] = '\0';
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync if (pVerInfo->dwOSVersionInfoSize >= sizeof(RTL_OSVERSIONINFOEXW))
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync {
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PRTL_OSVERSIONINFOEXW pVerInfoEx = (PRTL_OSVERSIONINFOEXW)pVerInfo;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfoEx->wServicePackMajor = 0;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfoEx->wServicePackMinor = 0;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfoEx->wSuiteMask = 0;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfoEx->wProductType = VER_NT_WORKSTATION;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pVerInfoEx->wReserved = 0;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync }
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return STATUS_SUCCESS;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic NTSTATUS __stdcall Resolve_RtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync UNICODE_STRING RoutineName;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PFNRTLGETVERSION pfn;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Resolve_RtlGetVersion: %p\n", pVerInfo));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync RtlInitUnicodeString(&RoutineName, L"RtlGetVersion");
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn = (PFNRTLGETVERSION)MmGetSystemRoutineAddress(&RoutineName);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync if (!pfn)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn = Fake_RtlGetVersion;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync ASMAtomicWritePtr(&g_pfnRtlGetVersion, pfn);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return pfn(pVerInfo);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#undef RtlGetVersion
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync__declspec(dllexport) NTSTATUS __stdcall
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncRtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return g_pfnRtlGetVersion(pVerInfo);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync/*
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync * PsGetProcessImageFileName
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync */
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsynctypedef LPSTR (__stdcall * PFNPSGETPROCESSIMAGEFILENAME)(PEPROCESS pProcess);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic LPSTR __stdcall Resolve_PsGetProcessImageFileName(PEPROCESS pProcess);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic volatile PFNPSGETPROCESSIMAGEFILENAME g_pfnPsGetProcessImageFileName = Resolve_PsGetProcessImageFileName;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic LPSTR __stdcall Fake_PsGetProcessImageFileName(PEPROCESS pProcess)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Fake_PsGetProcessImageFileName: %p\n", pProcess));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return "Fake_PsGetProcessImageFileName";
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncstatic LPSTR __stdcall Resolve_PsGetProcessImageFileName(PEPROCESS pProcess)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync UNICODE_STRING RoutineName;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync PFNPSGETPROCESSIMAGEFILENAME pfn;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync Log(("Resolve_PsGetProcessImageFileName: %p\n", pProcess));
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync RtlInitUnicodeString(&RoutineName, L"PsGetProcessImageFileName");
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn = (PFNPSGETPROCESSIMAGEFILENAME)MmGetSystemRoutineAddress(&RoutineName);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync if (!pfn)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync pfn = Fake_PsGetProcessImageFileName;
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync ASMAtomicWritePtr(&g_pfnPsGetProcessImageFileName, pfn);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return pfn(pProcess);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync#undef PsGetProcessImageFileName
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync__declspec(dllexport) LPSTR __stdcall
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsyncPsGetProcessImageFileName(PEPROCESS pProcess)
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync{
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync return g_pfnPsGetProcessImageFileName(pProcess);
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync}
d86d6778ff0c57e2945a429ec47bf3b93cd9334evboxsync