The CRT's entry point does the following (this list is not complete):
- Initializes global state needed by the CRT. If this is not done, you cannot use any functions or state provided by the CRT.
- Initializes some global state that is used by the compiler. Run-time checks such as the security cookie used by /GS definitely stands out here. You can call __security_init_cookie yourself, however. You may need to add other code for other run-time checks.
- Calls constructors on C++ objects. If you are writing C++ code, you may need to emulate this.
- Retrieves command line and start up information provided by the OS and passes it your main. By default, no parameters are passed to the entry point of the program by the OS - they are all provied by the CRT.
The CRT source code is available with Visual Studio and you can step through the CRT's entry point in a debugger and find out exactly what it is doing.