ZeroMemory を使うと CRT とリンクされる
ZeroMemory や CopyMemory などの Win32 API は CRT (C Runtime Library) の呼び出しに置き換えられる模様です。
// Winbase.h より抜粋 #define MoveMemory RtlMoveMemory #define CopyMemory RtlCopyMemory #define FillMemory RtlFillMemory #define ZeroMemory RtlZeroMemory
// Winnt.h より抜粋 #define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length)) #define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length)) #define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length)) #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
x86 の Kernel32.dll には RtlMoveMemory, RtlFillMemory, RtlZeroMemory がエクスポートされているので、 CRT 関数でなく、これを利用することができそう。 Win XP では Kernel32 経由で NTDLL.dll 内の定義を呼び出すようなので、 GetProcAddress する際は NTDLL.dll からしたほうが (微妙に) 効率がよいとおもわれます。
以下の定義をすると GetProcAddress しなくても、それぞれの関数が利用できるようになるみたいです:
#undef RtlMoveMemory #undef RtlFillMemory #undef RtlZeroMemory EXTERN_C NTSYSAPI VOID NTAPI RtlMoveMemory (LPVOID UNALIGNED Dst, LPCVOID UNALIGNED Src, SIZE_T Length); EXTERN_C NTSYSAPI VOID NTAPI RtlFillMemory (LPVOID UNALIGNED Dst, SIZE_T Length, BYTE Pattern); EXTERN_C NTSYSAPI VOID NTAPI RtlZeroMemory (LPVOID UNALIGNED Dst, SIZE_T Length);
(NTSYSAPI プリプロセッサーは __declspec(dllimport) に展開されるため、リンク時にリンカーがシンボル参照を解決してくれる)