#include "stdafx.h"

#include <vector>
#include <string>
#include <sstream>

extern "C"
BOOL WINAPI _CRT_INIT(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);

#pragma comment(lib, "vcruntime.lib")
//#pragma comment(lib, "ucrt.lib")

typedef void(*myfree_t)(void *ptr);
typedef void*(*mymalloc_t)(size_t n);
typedef int(*_mycallnewh_t)(size_t n);

static myfree_t myfree;
static mymalloc_t mymalloc;
static _mycallnewh_t _mycallnewh;

void _invalid_parameter_noinfo_noreturn(void) {
	ExitProcess(1);
}

extern "C"
void * malloc(size_t n) {
	return mymalloc(n);
}

extern "C"
void free(void *ptr) {
	myfree(ptr);
}

extern "C"
int _callnewh(size_t n) {
	return _mycallnewh(n);
}

void MyFnResolve(void) {

}

void APIENTRY LibEntry(PVOID user_ptr)
{
	static bool firstEntry = true;

	if (firstEntry) {
		firstEntry = false;

		HMODULE msvcrtModule = LoadLibraryA("msvcrt.dll");
		mymalloc = (mymalloc_t) GetProcAddress(msvcrtModule, "malloc");
		myfree = (myfree_t) GetProcAddress(msvcrtModule, "free");
		_mycallnewh = (_mycallnewh_t)GetProcAddress(msvcrtModule, "_callnewh");
		if (!mymalloc || !myfree || !_mycallnewh) {
			return;
		}
#if 1
		std::string text;
		std::vector<DWORD> blubb;
		text = "DllMain from TestDLL: ";
		blubb.push_back(1);
		blubb.push_back(2);
		//std::wstringstream muh;
		//muh << "bla" << "," << "blubb";
#endif
		MessageBoxA(NULL,
			text.c_str(),
			"TestDLL Notification",
			MB_OK | MB_ICONINFORMATION);
#if 0
		if (firstEntry &&
			!_CRT_INIT(NULL, DLL_PROCESS_ATTACH, NULL)) {
			MessageBoxA(NULL,
				"DllMain _CRT_INIT failed",
				"TestDLL Notification",
				MB_OK | MB_ICONINFORMATION);
		}
#endif
	}
}