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) に展開されるため、リンク時にリンカーがシンボル参照を解決してくれる)