Did you check the addresses? Are they correct? Calling convention should be correct.
This line might be another neckbreaker:
memcpy((void*)&page,(void*)0x00401000,Buffer.Regio nSize);
"page" is already your pointer, you're passing its address and memcpy tries to write to your stack or whatever but not to your allocated memory. reinterpret_cast<LPVOID>(page) should do it.