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