Win2kWorkarounds.c revision d86d6778ff0c57e2945a429ec47bf3b93cd9334e
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * VirtualBox Windows Guest Shared Folders - Windows 2000 Hacks.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Copyright (C) 2012 Oracle Corporation
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* Header Files *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync*******************************************************************************/
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#define FsRtlTeardownPerStreamContexts FsRtlTeardownPerStreamContexts_AvoidIt
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#define PsGetProcessImageFileName PsGetProcessImageFileName_AvoidIt
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * FsRtlTeardownPerStreamContexts.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic VOID __stdcall Resolve_FsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic volatile PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS g_pfnFsRtlTeardownPerStreamContexts = Resolve_FsRtlTeardownPerStreamContexts;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic VOID __stdcall Fake_FsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER pAdvancedHeader)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PFSRTL_PER_STREAM_CONTEXT pCtx = CONTAINING_RECORD(pCur, FSRTL_PER_STREAM_CONTEXT, Links);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("Fake_FsRtlTeardownPerStreamContexts: %p\n", pCtx));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync InitializeListHead(&pAdvancedHeader->FilterContexts);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic VOID __stdcall Resolve_FsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER pAdvancedHeader)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("Resolve_FsRtlTeardownPerStreamContexts: %p\n", pAdvancedHeader));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync RtlInitUnicodeString(&RoutineName, L"KeIpiGenericCall");
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync pfn = (PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS)MmGetSystemRoutineAddress(&RoutineName);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ASMAtomicWritePtr(&g_pfnFsRtlTeardownPerStreamContexts, pfn);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncFsRtlTeardownPerStreamContexts(PFSRTL_ADVANCED_FCB_HEADER pAdvancedHeader)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("FsRtlTeardownPerStreamContexts: %p\n", pAdvancedHeader));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync g_pfnFsRtlTeardownPerStreamContexts(pAdvancedHeader);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("FsRtlTeardownPerStreamContexts: returns\n"));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * RtlGetVersion
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsynctypedef NTSTATUS (__stdcall * PFNRTLGETVERSION)(PRTL_OSVERSIONINFOW);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic NTSTATUS __stdcall Resolve_RtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic volatile PFNRTLGETVERSION g_pfnRtlGetVersion = Resolve_RtlGetVersion;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic NTSTATUS __stdcall Fake_RtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync if (pVerInfo->dwOSVersionInfoSize < sizeof(*pVerInfo))
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("Fake_RtlGetVersion: -> STATUS_INVALID_PARAMETER (size = %#x)\n", pVerInfo->dwOSVersionInfoSize));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Report Windows 2000 w/o SP. */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync if (pVerInfo->dwOSVersionInfoSize >= sizeof(RTL_OSVERSIONINFOEXW))
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PRTL_OSVERSIONINFOEXW pVerInfoEx = (PRTL_OSVERSIONINFOEXW)pVerInfo;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic NTSTATUS __stdcall Resolve_RtlGetVersion(PRTL_OSVERSIONINFOW pVerInfo)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync RtlInitUnicodeString(&RoutineName, L"RtlGetVersion");
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync pfn = (PFNRTLGETVERSION)MmGetSystemRoutineAddress(&RoutineName);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * PsGetProcessImageFileName
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsynctypedef LPSTR (__stdcall * PFNPSGETPROCESSIMAGEFILENAME)(PEPROCESS pProcess);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic LPSTR __stdcall Resolve_PsGetProcessImageFileName(PEPROCESS pProcess);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic volatile PFNPSGETPROCESSIMAGEFILENAME g_pfnPsGetProcessImageFileName = Resolve_PsGetProcessImageFileName;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic LPSTR __stdcall Fake_PsGetProcessImageFileName(PEPROCESS pProcess)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("Fake_PsGetProcessImageFileName: %p\n", pProcess));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync return "Fake_PsGetProcessImageFileName";
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncstatic LPSTR __stdcall Resolve_PsGetProcessImageFileName(PEPROCESS pProcess)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync Log(("Resolve_PsGetProcessImageFileName: %p\n", pProcess));
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync RtlInitUnicodeString(&RoutineName, L"PsGetProcessImageFileName");
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync pfn = (PFNPSGETPROCESSIMAGEFILENAME)MmGetSystemRoutineAddress(&RoutineName);