2 * Implementation of mscoree.dll
3 * Microsoft Component Object Runtime Execution Engine
5 * Copyright 2006 Paul Chitescu
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/unicode.h"
26 #include "wine/library.h"
45 #include "wine/list.h"
46 #include "mscoree_private.h"
49 #include "wine/debug.h"
51 WINE_DEFAULT_DEBUG_CHANNEL( mscoree
);
53 static HINSTANCE MSCOREE_hInstance
;
55 typedef HRESULT (*fnCreateInstance
)(REFIID riid
, LPVOID
*ppObj
);
57 char *WtoA(LPCWSTR wstr
)
62 length
= WideCharToMultiByte(CP_UTF8
, 0, wstr
, -1, NULL
, 0, NULL
, NULL
);
64 result
= HeapAlloc(GetProcessHeap(), 0, length
);
67 WideCharToMultiByte(CP_UTF8
, 0, wstr
, -1, result
, length
, NULL
, NULL
);
72 static BOOL
get_install_root(LPWSTR install_dir
)
74 const WCHAR dotnet_key
[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','.','N','E','T','F','r','a','m','e','w','o','r','k','\\',0};
75 const WCHAR install_root
[] = {'I','n','s','t','a','l','l','R','o','o','t',0};
80 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, dotnet_key
, 0, KEY_READ
, &key
))
84 if (RegQueryValueExW(key
, install_root
, 0, NULL
, (LPBYTE
)install_dir
, &len
))
94 typedef struct mscorecf
96 IClassFactory IClassFactory_iface
;
99 fnCreateInstance pfnCreateInstance
;
104 static inline mscorecf
*impl_from_IClassFactory( IClassFactory
*iface
)
106 return CONTAINING_RECORD(iface
, mscorecf
, IClassFactory_iface
);
109 static HRESULT WINAPI
mscorecf_QueryInterface(IClassFactory
*iface
, REFIID riid
, LPVOID
*ppobj
)
111 TRACE("%s %p\n", debugstr_guid(riid
), ppobj
);
113 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
114 IsEqualGUID(riid
, &IID_IClassFactory
))
116 IClassFactory_AddRef( iface
);
121 ERR("interface %s not implemented\n", debugstr_guid(riid
));
122 return E_NOINTERFACE
;
125 static ULONG WINAPI
mscorecf_AddRef(IClassFactory
*iface
)
127 mscorecf
*This
= impl_from_IClassFactory(iface
);
128 ULONG ref
= InterlockedIncrement(&This
->ref
);
130 TRACE("%p ref=%u\n", This
, ref
);
135 static ULONG WINAPI
mscorecf_Release(IClassFactory
*iface
)
137 mscorecf
*This
= impl_from_IClassFactory(iface
);
138 ULONG ref
= InterlockedDecrement(&This
->ref
);
140 TRACE("%p ref=%u\n", This
, ref
);
144 HeapFree(GetProcessHeap(), 0, This
);
150 static HRESULT WINAPI
mscorecf_CreateInstance(IClassFactory
*iface
,LPUNKNOWN pOuter
,
151 REFIID riid
, LPVOID
*ppobj
)
153 mscorecf
*This
= impl_from_IClassFactory( iface
);
157 TRACE("%p %s %p\n", pOuter
, debugstr_guid(riid
), ppobj
);
162 return CLASS_E_NOAGGREGATION
;
164 hr
= This
->pfnCreateInstance( &This
->clsid
, (LPVOID
*) &punk
);
167 hr
= IUnknown_QueryInterface( punk
, riid
, ppobj
);
169 IUnknown_Release( punk
);
173 WARN("Cannot create an instance object. 0x%08x\n", hr
);
178 static HRESULT WINAPI
mscorecf_LockServer(IClassFactory
*iface
, BOOL dolock
)
180 FIXME("(%p)->(%d),stub!\n",iface
,dolock
);
184 static const struct IClassFactoryVtbl mscorecf_vtbl
=
186 mscorecf_QueryInterface
,
189 mscorecf_CreateInstance
,
193 HRESULT WINAPI
CorBindToRuntimeHost(LPCWSTR pwszVersion
, LPCWSTR pwszBuildFlavor
,
194 LPCWSTR pwszHostConfigFile
, VOID
*pReserved
,
195 DWORD startupFlags
, REFCLSID rclsid
,
196 REFIID riid
, LPVOID
*ppv
)
199 ICLRRuntimeInfo
*info
;
201 TRACE("(%s, %s, %s, %p, %d, %s, %s, %p)\n", debugstr_w(pwszVersion
),
202 debugstr_w(pwszBuildFlavor
), debugstr_w(pwszHostConfigFile
), pReserved
,
203 startupFlags
, debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
207 ret
= get_runtime_info(NULL
, pwszVersion
, pwszHostConfigFile
, startupFlags
, 0, TRUE
, &info
);
211 ret
= ICLRRuntimeInfo_GetInterface(info
, rclsid
, riid
, ppv
);
213 ICLRRuntimeInfo_Release(info
);
219 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
221 TRACE("(%p, %d, %p)\n", hinstDLL
, fdwReason
, lpvReserved
);
223 MSCOREE_hInstance
= hinstDLL
;
227 case DLL_WINE_PREATTACH
:
228 return FALSE
; /* prefer native version */
229 case DLL_PROCESS_ATTACH
:
231 DisableThreadLibraryCalls(hinstDLL
);
233 case DLL_PROCESS_DETACH
:
234 expect_no_runtimes();
235 if (lpvReserved
) break; /* process is terminating */
236 runtimehost_uninit();
242 __int32 WINAPI
_CorExeMain2(PBYTE ptrMemory
, DWORD cntMemory
, LPWSTR imageName
, LPWSTR loaderName
, LPWSTR cmdLine
)
244 TRACE("(%p, %u, %s, %s, %s)\n", ptrMemory
, cntMemory
, debugstr_w(imageName
), debugstr_w(loaderName
), debugstr_w(cmdLine
));
245 FIXME("Directly running .NET applications not supported.\n");
249 void WINAPI
CorExitProcess(int exitCode
)
251 TRACE("(%x)\n", exitCode
);
252 CLRMetaHost_ExitProcess(0, exitCode
);
255 VOID WINAPI
_CorImageUnloading(PVOID imageBase
)
257 TRACE("(%p): stub\n", imageBase
);
260 HRESULT WINAPI
_CorValidateImage(PVOID
* imageBase
, LPCWSTR imageName
)
262 TRACE("(%p, %s): stub\n", imageBase
, debugstr_w(imageName
));
266 HRESULT WINAPI
GetCORSystemDirectory(LPWSTR pbuffer
, DWORD cchBuffer
, DWORD
*dwLength
)
268 ICLRRuntimeInfo
*info
;
271 TRACE("(%p, %d, %p)!\n", pbuffer
, cchBuffer
, dwLength
);
273 if (!dwLength
|| !pbuffer
)
276 ret
= get_runtime_info(NULL
, NULL
, NULL
, 0, RUNTIME_INFO_UPGRADE_VERSION
, TRUE
, &info
);
280 *dwLength
= cchBuffer
;
281 ret
= ICLRRuntimeInfo_GetRuntimeDirectory(info
, pbuffer
, dwLength
);
283 ICLRRuntimeInfo_Release(info
);
289 HRESULT WINAPI
GetCORVersion(LPWSTR pbuffer
, DWORD cchBuffer
, DWORD
*dwLength
)
291 ICLRRuntimeInfo
*info
;
294 TRACE("(%p, %d, %p)!\n", pbuffer
, cchBuffer
, dwLength
);
296 if (!dwLength
|| !pbuffer
)
299 ret
= get_runtime_info(NULL
, NULL
, NULL
, 0, RUNTIME_INFO_UPGRADE_VERSION
, TRUE
, &info
);
303 *dwLength
= cchBuffer
;
304 ret
= ICLRRuntimeInfo_GetVersionString(info
, pbuffer
, dwLength
);
306 ICLRRuntimeInfo_Release(info
);
312 HRESULT WINAPI
GetRequestedRuntimeInfo(LPCWSTR pExe
, LPCWSTR pwszVersion
, LPCWSTR pConfigurationFile
,
313 DWORD startupFlags
, DWORD runtimeInfoFlags
, LPWSTR pDirectory
, DWORD dwDirectory
, DWORD
*dwDirectoryLength
,
314 LPWSTR pVersion
, DWORD cchBuffer
, DWORD
*dwlength
)
317 ICLRRuntimeInfo
*info
;
320 TRACE("(%s, %s, %s, 0x%08x, 0x%08x, %p, 0x%08x, %p, %p, 0x%08x, %p)\n", debugstr_w(pExe
),
321 debugstr_w(pwszVersion
), debugstr_w(pConfigurationFile
), startupFlags
, runtimeInfoFlags
, pDirectory
,
322 dwDirectory
, dwDirectoryLength
, pVersion
, cchBuffer
, dwlength
);
324 if (!dwDirectoryLength
) dwDirectoryLength
= &length_dummy
;
326 if (!dwlength
) dwlength
= &length_dummy
;
328 ret
= get_runtime_info(pExe
, pwszVersion
, pConfigurationFile
, startupFlags
, runtimeInfoFlags
, TRUE
, &info
);
332 *dwlength
= cchBuffer
;
333 ret
= ICLRRuntimeInfo_GetVersionString(info
, pVersion
, dwlength
);
338 pVersion
[0] = pwszVersion
[0];
340 *dwDirectoryLength
= dwDirectory
;
341 ret
= ICLRRuntimeInfo_GetRuntimeDirectory(info
, pDirectory
, dwDirectoryLength
);
344 ICLRRuntimeInfo_Release(info
);
350 HRESULT WINAPI
GetRequestedRuntimeVersion(LPWSTR pExe
, LPWSTR pVersion
, DWORD cchBuffer
, DWORD
*dwlength
)
352 TRACE("(%s, %p, %d, %p)\n", debugstr_w(pExe
), pVersion
, cchBuffer
, dwlength
);
357 return GetRequestedRuntimeInfo(pExe
, NULL
, NULL
, 0, 0, NULL
, 0, NULL
, pVersion
, cchBuffer
, dwlength
);
360 HRESULT WINAPI
GetRealProcAddress(LPCSTR procname
, void **ppv
)
362 FIXME("(%s, %p)\n", debugstr_a(procname
), ppv
);
363 return CLR_E_SHIM_RUNTIMEEXPORT
;
366 HRESULT WINAPI
GetFileVersion(LPCWSTR szFilename
, LPWSTR szBuffer
, DWORD cchBuffer
, DWORD
*dwLength
)
368 TRACE("(%s, %p, %d, %p)\n", debugstr_w(szFilename
), szBuffer
, cchBuffer
, dwLength
);
370 if (!szFilename
|| !dwLength
)
373 *dwLength
= cchBuffer
;
374 return CLRMetaHost_GetVersionFromFile(0, szFilename
, szBuffer
, dwLength
);
377 HRESULT WINAPI
LoadLibraryShim( LPCWSTR szDllName
, LPCWSTR szVersion
, LPVOID pvReserved
, HMODULE
* phModDll
)
380 WCHAR dll_filename
[MAX_PATH
];
381 WCHAR version
[MAX_PATH
];
382 static const WCHAR default_version
[] = {'v','1','.','1','.','4','3','2','2',0};
383 static const WCHAR slash
[] = {'\\',0};
386 TRACE("(%p %s, %p, %p, %p)\n", szDllName
, debugstr_w(szDllName
), szVersion
, pvReserved
, phModDll
);
388 if (!szDllName
|| !phModDll
)
391 if (!get_install_root(dll_filename
))
393 ERR("error reading registry key for installroot\n");
400 ret
= GetCORVersion(version
, MAX_PATH
, &dummy
);
404 szVersion
= default_version
;
406 strcatW(dll_filename
, szVersion
);
407 strcatW(dll_filename
, slash
);
410 strcatW(dll_filename
, szDllName
);
412 *phModDll
= LoadLibraryW(dll_filename
);
414 return *phModDll
? S_OK
: E_HANDLE
;
417 HRESULT WINAPI
LockClrVersion(FLockClrVersionCallback hostCallback
, FLockClrVersionCallback
*pBeginHostSetup
, FLockClrVersionCallback
*pEndHostSetup
)
419 FIXME("(%p %p %p): stub\n", hostCallback
, pBeginHostSetup
, pEndHostSetup
);
423 HRESULT WINAPI
CoInitializeCor(DWORD fFlags
)
425 FIXME("(0x%08x): stub\n", fFlags
);
429 HRESULT WINAPI
GetAssemblyMDImport(LPCWSTR szFileName
, REFIID riid
, IUnknown
**ppIUnk
)
431 FIXME("(%p %s, %s, %p): stub\n", szFileName
, debugstr_w(szFileName
), debugstr_guid(riid
), *ppIUnk
);
432 return ERROR_CALL_NOT_IMPLEMENTED
;
435 HRESULT WINAPI
GetVersionFromProcess(HANDLE hProcess
, LPWSTR pVersion
, DWORD cchBuffer
, DWORD
*dwLength
)
437 FIXME("(%p, %p, %d, %p): stub\n", hProcess
, pVersion
, cchBuffer
, dwLength
);
441 HRESULT WINAPI
LoadStringRCEx(LCID culture
, UINT resId
, LPWSTR pBuffer
, int iBufLen
, int bQuiet
, int* pBufLen
)
444 if ((iBufLen
<= 0) || !pBuffer
)
448 FIXME("(%d, %x, %p, %d, %d, %p): semi-stub\n", culture
, resId
, pBuffer
, iBufLen
, bQuiet
, pBufLen
);
454 *pBufLen
= lstrlenW(pBuffer
);
458 HRESULT WINAPI
LoadStringRC(UINT resId
, LPWSTR pBuffer
, int iBufLen
, int bQuiet
)
460 return LoadStringRCEx(-1, resId
, pBuffer
, iBufLen
, bQuiet
, NULL
);
463 HRESULT WINAPI
CorBindToRuntimeEx(LPWSTR szVersion
, LPWSTR szBuildFlavor
, DWORD nflags
, REFCLSID rslsid
,
464 REFIID riid
, LPVOID
*ppv
)
467 ICLRRuntimeInfo
*info
;
469 TRACE("%s %s %d %s %s %p\n", debugstr_w(szVersion
), debugstr_w(szBuildFlavor
), nflags
, debugstr_guid( rslsid
),
470 debugstr_guid( riid
), ppv
);
474 ret
= get_runtime_info(NULL
, szVersion
, NULL
, nflags
, RUNTIME_INFO_UPGRADE_VERSION
, TRUE
, &info
);
478 ret
= ICLRRuntimeInfo_GetInterface(info
, rslsid
, riid
, ppv
);
480 ICLRRuntimeInfo_Release(info
);
486 HRESULT WINAPI
CorBindToCurrentRuntime(LPCWSTR filename
, REFCLSID rclsid
, REFIID riid
, LPVOID
*ppv
)
489 ICLRRuntimeInfo
*info
;
491 TRACE("(%s, %s, %s, %p)\n", debugstr_w(filename
), debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
495 ret
= get_runtime_info(NULL
, NULL
, filename
, 0, RUNTIME_INFO_UPGRADE_VERSION
, TRUE
, &info
);
499 ret
= ICLRRuntimeInfo_GetInterface(info
, rclsid
, riid
, ppv
);
501 ICLRRuntimeInfo_Release(info
);
507 STDAPI
ClrCreateManagedInstance(LPCWSTR pTypeName
, REFIID riid
, void **ppObject
)
510 ICLRRuntimeInfo
*info
;
515 TRACE("(%s,%s,%p)\n", debugstr_w(pTypeName
), debugstr_guid(riid
), ppObject
);
517 /* FIXME: How to determine which runtime version to use? */
518 ret
= get_runtime_info(NULL
, NULL
, NULL
, 0, RUNTIME_INFO_UPGRADE_VERSION
, TRUE
, &info
);
522 ret
= ICLRRuntimeInfo_GetRuntimeHost(info
, &host
);
524 ICLRRuntimeInfo_Release(info
);
528 ret
= RuntimeHost_CreateManagedInstance(host
, pTypeName
, NULL
, &obj
);
531 ret
= RuntimeHost_GetIUnknownForObject(host
, obj
, &unk
);
535 ret
= IUnknown_QueryInterface(unk
, riid
, ppObject
);
536 IUnknown_Release(unk
);
542 BOOL WINAPI
StrongNameSignatureVerification(LPCWSTR filename
, DWORD inFlags
, DWORD
* pOutFlags
)
544 FIXME("(%s, 0x%X, %p): stub\n", debugstr_w(filename
), inFlags
, pOutFlags
);
548 BOOL WINAPI
StrongNameSignatureVerificationEx(LPCWSTR filename
, BOOL forceVerification
, BOOL
* pVerified
)
550 FIXME("(%s, %u, %p): stub\n", debugstr_w(filename
), forceVerification
, pVerified
);
554 HRESULT WINAPI
CreateDebuggingInterfaceFromVersion(int nDebugVersion
, LPCWSTR version
, IUnknown
**ppv
)
556 const WCHAR v2_0
[] = {'v','2','.','0','.','5','0','7','2','7',0};
558 ICLRRuntimeInfo
*runtimeinfo
;
560 if(nDebugVersion
< 1 || nDebugVersion
> 4)
563 TRACE("(%d %s, %p): stub\n", nDebugVersion
, debugstr_w(version
), ppv
);
570 if(strcmpW(version
, v2_0
) != 0)
572 FIXME("Currently .NET Version '%s' not support.\n", debugstr_w(version
));
576 if(nDebugVersion
!= 3)
579 hr
= CLRMetaHost_GetRuntime(0, version
, &IID_ICLRRuntimeInfo
, (void**)&runtimeinfo
);
582 hr
= ICLRRuntimeInfo_GetInterface(runtimeinfo
, &CLSID_CLRDebuggingLegacy
, &IID_ICorDebug
, (void**)ppv
);
584 ICLRRuntimeInfo_Release(runtimeinfo
);
593 HRESULT WINAPI
CLRCreateInstance(REFCLSID clsid
, REFIID riid
, LPVOID
*ppInterface
)
595 TRACE("(%s,%s,%p)\n", debugstr_guid(clsid
), debugstr_guid(riid
), ppInterface
);
597 if (IsEqualGUID(clsid
, &CLSID_CLRMetaHost
))
598 return CLRMetaHost_CreateInstance(riid
, ppInterface
);
599 if (IsEqualGUID(clsid
, &CLSID_CLRMetaHostPolicy
))
600 return CLRMetaHostPolicy_CreateInstance(riid
, ppInterface
);
602 FIXME("not implemented for class %s\n", debugstr_guid(clsid
));
604 return CLASS_E_CLASSNOTAVAILABLE
;
607 HRESULT WINAPI
CreateInterface(REFCLSID clsid
, REFIID riid
, LPVOID
*ppInterface
)
609 TRACE("(%s,%s,%p)\n", debugstr_guid(clsid
), debugstr_guid(riid
), ppInterface
);
611 return CLRCreateInstance(clsid
, riid
, ppInterface
);
614 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, LPVOID
* ppv
)
619 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
624 This
= HeapAlloc(GetProcessHeap(), 0, sizeof(mscorecf
));
626 This
->IClassFactory_iface
.lpVtbl
= &mscorecf_vtbl
;
627 This
->pfnCreateInstance
= create_monodata
;
629 This
->clsid
= *rclsid
;
631 hr
= IClassFactory_QueryInterface( &This
->IClassFactory_iface
, riid
, ppv
);
632 IClassFactory_Release(&This
->IClassFactory_iface
);
637 static void parse_msi_version_string(const char *version
, int *parts
)
639 const char *minor_start
, *build_start
;
641 parts
[0] = atoi(version
);
643 parts
[1] = parts
[2] = 0;
645 minor_start
= strchr(version
, '.');
649 parts
[1] = atoi(minor_start
);
651 build_start
= strchr(minor_start
, '.');
653 parts
[2] = atoi(build_start
+1);
657 static BOOL
install_wine_mono(void)
659 BOOL is_wow64
= FALSE
;
661 UINT (WINAPI
*pMsiGetProductInfoA
)(LPCSTR
,LPCSTR
,LPSTR
,DWORD
*);
662 char versionstringbuf
[15];
665 PROCESS_INFORMATION pi
;
672 static const char* mono_version
= "4.7.1";
673 static const char* mono_product_code
= "{E45D8920-A758-4088-B6C6-31DBB276992E}";
675 static const WCHAR controlW
[] = {'\\','c','o','n','t','r','o','l','.','e','x','e',0};
676 static const WCHAR argsW
[] =
677 {' ','a','p','p','w','i','z','.','c','p','l',' ','i','n','s','t','a','l','l','_','m','o','n','o',0};
679 IsWow64Process(GetCurrentProcess(), &is_wow64
);
683 TRACE("not installing mono in wow64 process\n");
687 hmsi
= LoadLibraryA("msi");
691 ERR("couldn't load msi.dll\n");
695 pMsiGetProductInfoA
= (void*)GetProcAddress(hmsi
, "MsiGetProductInfoA");
697 buffer_size
= sizeof(versionstringbuf
);
699 res
= pMsiGetProductInfoA(mono_product_code
, "VersionString", versionstringbuf
, &buffer_size
);
703 if (res
== ERROR_SUCCESS
)
705 int current_version
[3], wanted_version
[3], i
;
707 TRACE("found installed version %s\n", versionstringbuf
);
709 parse_msi_version_string(versionstringbuf
, current_version
);
710 parse_msi_version_string(mono_version
, wanted_version
);
714 if (current_version
[i
] < wanted_version
[i
])
716 else if (current_version
[i
] > wanted_version
[i
])
718 TRACE("installed version is newer than %s, quitting\n", mono_version
);
725 TRACE("version %s is already installed, quitting\n", mono_version
);
730 len
= GetSystemDirectoryW(app
, MAX_PATH
-sizeof(controlW
)/sizeof(WCHAR
));
731 memcpy(app
+len
, controlW
, sizeof(controlW
));
733 args
= HeapAlloc(GetProcessHeap(), 0, (len
*sizeof(WCHAR
) + sizeof(controlW
) + sizeof(argsW
)));
737 memcpy(args
, app
, len
*sizeof(WCHAR
) + sizeof(controlW
));
738 memcpy(args
+ len
+ sizeof(controlW
)/sizeof(WCHAR
)-1, argsW
, sizeof(argsW
));
740 TRACE("starting %s\n", debugstr_w(args
));
742 memset(&si
, 0, sizeof(si
));
744 ret
= CreateProcessW(app
, args
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
);
745 HeapFree(GetProcessHeap(), 0, args
);
747 CloseHandle(pi
.hThread
);
748 WaitForSingleObject(pi
.hProcess
, INFINITE
);
749 CloseHandle(pi
.hProcess
);
755 HRESULT WINAPI
DllRegisterServer(void)
759 return __wine_register_resources( MSCOREE_hInstance
);
762 HRESULT WINAPI
DllUnregisterServer(void)
764 return __wine_unregister_resources( MSCOREE_hInstance
);
767 HRESULT WINAPI
DllCanUnloadNow(VOID
)
772 void WINAPI
CoEEShutDownCOM(void)
777 INT WINAPI
ND_RU1( const void *ptr
, INT offset
)
779 return *((const BYTE
*)ptr
+ offset
);
782 INT WINAPI
ND_RI2( const void *ptr
, INT offset
)
784 return *(const SHORT
*)((const BYTE
*)ptr
+ offset
);
787 INT WINAPI
ND_RI4( const void *ptr
, INT offset
)
789 return *(const INT
*)((const BYTE
*)ptr
+ offset
);
792 INT64 WINAPI
ND_RI8( const void *ptr
, INT offset
)
794 return *(const INT64
*)((const BYTE
*)ptr
+ offset
);
797 void WINAPI
ND_WU1( void *ptr
, INT offset
, BYTE val
)
799 *((BYTE
*)ptr
+ offset
) = val
;
802 void WINAPI
ND_WI2( void *ptr
, INT offset
, SHORT val
)
804 *(SHORT
*)((BYTE
*)ptr
+ offset
) = val
;
807 void WINAPI
ND_WI4( void *ptr
, INT offset
, INT val
)
809 *(INT
*)((BYTE
*)ptr
+ offset
) = val
;
812 void WINAPI
ND_WI8( void *ptr
, INT offset
, INT64 val
)
814 *(INT64
*)((BYTE
*)ptr
+ offset
) = val
;
817 void WINAPI
ND_CopyObjDst( const void *src
, void *dst
, INT offset
, INT size
)
819 memcpy( (BYTE
*)dst
+ offset
, src
, size
);
822 void WINAPI
ND_CopyObjSrc( const void *src
, INT offset
, void *dst
, INT size
)
824 memcpy( dst
, (const BYTE
*)src
+ offset
, size
);