mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.2 KiB
91 lines
2.2 KiB
"\t case DLL_PROCESS_DETACH:\n\
|
|
\t\t FreeStack() ;\n\
|
|
\t\t TlsFree(dwTlsIndex) ;\n\
|
|
\t\t FreeLibrary( hMod ) ;\n\
|
|
\t\t hMod = NULL ;\n\
|
|
\t\t break;\n\
|
|
\t}\n\
|
|
\treturn WrapperInit( hInst, dwReason, lpRes ) ;\n\
|
|
}\n\
|
|
\n\
|
|
/*\n\
|
|
** _prelude\n\
|
|
**\tThis routine handles saving the API call state and calling APIPrelude\n\
|
|
**\tThe return value is the API to call.\n\
|
|
*/\n\
|
|
FARPROC _prelude( DWORD dwId, PCALLSTACK pStack ) {\n\
|
|
\tBOOL\t bRet ;\n\
|
|
\tAPICALLDATA apidata ;\n\
|
|
\tDWORD\tdwAPIAddr ;\n\
|
|
\tDWORD dwError = GetLastError() ;\n\
|
|
\n\
|
|
\tapidata.dwID\t\t = dwId ;\n\
|
|
\tapidata.dwCallLevel = GetStackDepth() + 1 ;\n\
|
|
\tapidata.dwUserData\t= 0 ;\n\
|
|
\tapidata.Ret\t\t= 0 ;\n\
|
|
\tapidata.dwReturnAddress = pStack->dwReturnAddress ;\n\
|
|
\tapidata.pArgStack\t= (BYTE *)&(pStack->abArgs) ;\n\
|
|
\n\
|
|
\tbRet = APIPrelude( &apidata ) ;\n\
|
|
\n\
|
|
\t/* make sure these are not changed by APIPrelude */\n\
|
|
\tapidata.dwID\t\t = dwId ;\n\
|
|
\tapidata.dwCallLevel\t = GetStackDepth() + 1 ;\n\
|
|
\tapidata.dwReturnAddress = pStack->dwReturnAddress ;\n\
|
|
\tapidata.pArgStack\t= (BYTE *)&(pStack->abArgs) ;\n\
|
|
\n\
|
|
\t/* Place on stack */\n\
|
|
\tPushStack( &apidata ) ;\n\
|
|
\n\
|
|
\tSetLastError(dwError) ;\n\
|
|
\n\
|
|
\treturn bRet ? adwAPIAddress[dwId] : (FARPROC)0L ;\n\
|
|
}\n\
|
|
\n\
|
|
/*\n\
|
|
** _postlude\n\
|
|
**\tPop a call state off the stack and pass information to APIPostlude\n\
|
|
*/\n\
|
|
RETVAL\t\t_postlude( RETVAL Ret, PDWORD pdwReturnAddress ) {\n\
|
|
\tAPICALLDATA apidata ;\n\
|
|
\tRETVAL UserRet ;\n\
|
|
\tDWORD dwError = GetLastError() ;\n\
|
|
\n\
|
|
\tPopStack( &apidata ) ;\n\
|
|
\n\
|
|
\t/* patch up return address */\n\
|
|
\t*pdwReturnAddress = apidata.dwReturnAddress ;\n\
|
|
\n\
|
|
\tapidata.Ret = Ret ;\n\
|
|
\n\
|
|
\tUserRet = APIPostlude( &apidata ) ;\n\
|
|
\n\
|
|
\tSetLastError(dwError) ;\n\
|
|
\n\
|
|
\treturn UserRet ;\n\
|
|
}\n\
|
|
\n\
|
|
/*\n\
|
|
** WrapperNothing\n\
|
|
*/\n\
|
|
BOOL WINAPI WrapperNothing( void ) {\n\
|
|
\treturn TRUE ;\n\
|
|
}\n\
|
|
\n\
|
|
/*\n\
|
|
** InitStack\n\
|
|
**\tinitialize the per thread stack\n\
|
|
*/\n\
|
|
BOOL InitStack() {\n\
|
|
\tBOOL fRet = FALSE ;\n\
|
|
\tPAPIDATASTACK pAPIDataStack =\n\
|
|
\t (PAPIDATASTACK) LocalAlloc(LPTR, sizeof(APIDATASTACK) ) ;\n\
|
|
\n\
|
|
\tif (pAPIDataStack != NULL)\n\
|
|
\t fRet = TlsSetValue(dwTlsIndex, pAPIDataStack) ;\n\
|
|
\n\
|
|
\tpAPIDataStack->wTop = 0 ;\n\
|
|
\n\
|
|
\treturn fRet ;\n\
|
|
}\n\
|
|
\n"
|