Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
3.0 KiB

#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "windows.h"
#include "imagehlp.h"
#include "winthrow.h"
#include "fusionbuffer.h"
#include "sxshimlib.h"
#include "fusionhandle.h"
#include "sxsmain.h"
#include "lhport.h"
void __stdcall ThrowLastError(DWORD error = ::GetLastError())
{
::RaiseException(error, 0, 0, NULL);
//throw HRESULT_FROM_WIN32(error);
}
typedef HANDLE (WINAPI * PFN_CREATEFILEW)(
IN LPCWSTR lpFileName,
IN DWORD dwDesiredAccess,
IN DWORD dwShareMode,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
IN DWORD dwCreationDisposition,
IN DWORD dwFlagsAndAttributes,
IN HANDLE hTemplateFile
);
// This is exported and gets the previous value of CreateFileW.
PFN_CREATEFILEW My2OriginalCreateFileW;
//extern "C" {
HANDLE
WINAPI
My2CreateFileW(
IN LPCWSTR lpFileName,
IN DWORD dwDesiredAccess,
IN DWORD dwShareMode,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
IN DWORD dwCreationDisposition,
IN DWORD dwFlagsAndAttributes,
IN HANDLE hTemplateFile
)
{
printf("%s\n", __FUNCTION__);
if (My2OriginalCreateFileW == NULL)
{
::SetLastError(ERROR_INTERNAL_ERROR);
return INVALID_HANDLE_VALUE;
}
return My2OriginalCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
// This is exported and gets the previous value of CreateFileW.
PFN_CREATEFILEW MyOriginalCreateFileW;
HANDLE
WINAPI
MyCreateFileW(
IN LPCWSTR lpFileName,
IN DWORD dwDesiredAccess,
IN DWORD dwShareMode,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
IN DWORD dwCreationDisposition,
IN DWORD dwFlagsAndAttributes,
IN HANDLE hTemplateFile
)
{
printf("%s\n", __FUNCTION__);
if (MyOriginalCreateFileW == NULL)
{
::SetLastError(ERROR_INTERNAL_ERROR);
return INVALID_HANDLE_VALUE;
}
return MyOriginalCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
//}
int ShimExe(int argc, wchar_t** argv)
{
HMODULE ExeHandle = ::GetModuleHandleW(NULL);
if (!SxspDllMainOnDemandProcessAttachCalledByExports(ExeHandle, DLL_PROCESS_ATTACH, NULL))
ThrowLastError();
SXPE_APPLY_SHIMS_IN ShimIn = {sizeof(ShimIn)};
SXPE_APPLY_SHIMS_OUT ShimOut = {sizeof(ShimOut)};
ShimIn.DllToRedirectFrom = ExeHandle;
ShimIn.DllToRedirectTo.DllHandle = ExeHandle;
::CreateFileW(0, 0, 0, 0, 0, 0, 0);
::MyCreateFileW(0, 0, 0, 0, 0, 0, 0);
::My2CreateFileW(0, 0, 0, 0, 0, 0, 0);
SxPepApplyShims(&ShimIn, &ShimOut);
::CreateFileW(0, 0, 0, 0, 0, 0, 0);
ShimIn.Prefix = "My2";
SxPepApplyShims(&ShimIn, &ShimOut);
::CreateFileW(0, 0, 0, 0, 0, 0, 0);
//SxPepRevokeShims(ExeHandle);
//::CreateFileW(0, 0, 0, 0, 0, 0, 0);
return 0;
}