1.glCltDispatchTable
typedef struct _GLTEBINFO { // glCltDispatchTable must be the first field for the assembly code to work. // We pad the table with an extra entry if necessary to make glMsgBatchInfo // start at a qword boundary. PVOID glCltDispatchTable[(OPENGL_VERSION_110_ENTRIES+GL_EXT_PROC_TABLE_SIZE+1)/2*2]; // This field must be qword aligned! BYTE glMsgBatchInfo[SHARED_SECTION_SIZE]; #ifdef _WIN95_ // These fields must match the NT TEB definitions! PVOID glDispatchTable[280]; // fast dispatch table ULONG glReserved1[26]; // POLYARRAY structure PVOID glReserved2; // pointer to POLYMATERIAL structure PVOID glSectionInfo; // generic server GC PVOID glSection; // Not used PVOID glTable; // Used only for NT x86 PVOID glCurrentRC; // generic client RC PVOID glContext; // reserved by OpenGL ICD drivers #endif // _WIN95_ } GLTEBINFO, *PGLTEBINFO;
// There are now 2 tables! // One table is used for RGBA mode and the other is for CI mode. GLCLTPROCTABLE glCltRGBAProcTable = { /* Number of function entries in the table */ sizeof(GLDISPATCHTABLE) / sizeof(PROC), /* gl Entry points */ { glcltNewList , glcltEndList , glcltCallList , glcltCallLists , glcltDeleteLists , glcltGenLists , glcltListBase , glcltBegin , glcltBitmap , glcltColor3b_InRGBA , glcltColor3bv_InRGBA , glcltColor3d_InRGBA , glcltColor3dv_InRGBA , glcltColor3f_InRGBA , glcltColor3fv_InRGBA , glcltColor3i_InRGBA , glcltColor3iv_InRGBA , glcltColor3s_InRGBA , glcltColor3sv_InRGBA , glcltColor3ub_InRGBA , glcltColor3ubv_InRGBA , glcltColor3ui_InRGBA , glcltColor3uiv_InRGBA , glcltColor3us_InRGBA , glcltColor3usv_InRGBA , glcltColor4b_InRGBA , glcltColor4bv_InRGBA , glcltColor4d_InRGBA , glcltColor4dv_InRGBA , glcltColor4f_InRGBA , glcltColor4fv_InRGBA , glcltColor4i_InRGBA , glcltColor4iv_InRGBA , glcltColor4s_InRGBA , glcltColor4sv_InRGBA , glcltColor4ub_InRGBA , glcltColor4ubv_InRGBA , glcltColor4ui_InRGBA , glcltColor4uiv_InRGBA , glcltColor4us_InRGBA , glcltColor4usv_InRGBA , glcltEdgeFlag , glcltEdgeFlagv , glcltEnd , glcltIndexd_InRGBA , glcltIndexdv_InRGBA , glcltIndexf_InRGBA , glcltIndexfv_InRGBA , glcltIndexi_InRGBA , glcltIndexiv_InRGBA , glcltIndexs_InRGBA , glcltIndexsv_InRGBA , glcltNormal3b , glcltNormal3bv , glcltNormal3d , glcltNormal3dv , glcltNormal3f , glcltNormal3fv , glcltNormal3i , glcltNormal3iv , glcltNormal3s , glcltNormal3sv , glcltRasterPos2d , glcltRasterPos2dv , glcltRasterPos2f , glcltRasterPos2fv , glcltRasterPos2i , glcltRasterPos2iv , glcltRasterPos2s , glcltRasterPos2sv , glcltRasterPos3d , glcltRasterPos3dv , glcltRasterPos3f , glcltRasterPos3fv , glcltRasterPos3i , glcltRasterPos3iv , glcltRasterPos3s , glcltRasterPos3sv , glcltRasterPos4d , glcltRasterPos4dv , glcltRasterPos4f , glcltRasterPos4fv , glcltRasterPos4i , glcltRasterPos4iv , glcltRasterPos4s , glcltRasterPos4sv , glcltRectd , glcltRectdv , glcltRectf , glcltRectfv , glcltRecti , glcltRectiv , glcltRects , glcltRectsv , glcltTexCoord1d , glcltTexCoord1dv , glcltTexCoord1f , glcltTexCoord1fv , glcltTexCoord1i , glcltTexCoord1iv , glcltTexCoord1s , glcltTexCoord1sv , glcltTexCoord2d , glcltTexCoord2dv , glcltTexCoord2f , glcltTexCoord2fv , glcltTexCoord2i , glcltTexCoord2iv , glcltTexCoord2s , glcltTexCoord2sv , glcltTexCoord3d , glcltTexCoord3dv , glcltTexCoord3f , glcltTexCoord3fv , glcltTexCoord3i , glcltTexCoord3iv , glcltTexCoord3s , glcltTexCoord3sv , glcltTexCoord4d , glcltTexCoord4dv , glcltTexCoord4f , glcltTexCoord4fv , glcltTexCoord4i , glcltTexCoord4iv , glcltTexCoord4s , glcltTexCoord4sv , glcltVertex2d , glcltVertex2dv , glcltVertex2f , glcltVertex2fv , glcltVertex2i , glcltVertex2iv , glcltVertex2s , glcltVertex2sv , glcltVertex3d , glcltVertex3dv , glcltVertex3f , glcltVertex3fv , glcltVertex3i , glcltVertex3iv , glcltVertex3s , glcltVertex3sv , glcltVertex4d , glcltVertex4dv , glcltVertex4f , glcltVertex4fv , glcltVertex4i , glcltVertex4iv , glcltVertex4s , glcltVertex4sv , glcltClipPlane , glcltColorMaterial , glcltCullFace , glcltFogf , glcltFogfv , glcltFogi , glcltFogiv , glcltFrontFace , glcltHint , glcltLightf , glcltLightfv , glcltLighti , glcltLightiv , glcltLightModelf , glcltLightModelfv , glcltLightModeli , glcltLightModeliv , glcltLineStipple , glcltLineWidth , glcltMaterialf , glcltMaterialfv , glcltMateriali , glcltMaterialiv , glcltPointSize , glcltPolygonMode , glcltPolygonStipple , glcltScissor , glcltShadeModel , glcltTexParameterf , glcltTexParameterfv , glcltTexParameteri , glcltTexParameteriv , glcltTexImage1D , glcltTexImage2D , glcltTexEnvf , glcltTexEnvfv , glcltTexEnvi , glcltTexEnviv , glcltTexGend , glcltTexGendv , glcltTexGenf , glcltTexGenfv , glcltTexGeni , glcltTexGeniv , glcltFeedbackBuffer , glcltSelectBuffer , glcltRenderMode , glcltInitNames , glcltLoadName , glcltPassThrough , glcltPopName , glcltPushName , glcltDrawBuffer , glcltClear , glcltClearAccum , glcltClearIndex , glcltClearColor , glcltClearStencil , glcltClearDepth , glcltStencilMask , glcltColorMask , glcltDepthMask , glcltIndexMask , glcltAccum , glcltDisable , glcltEnable , glcltFinish , glcltFlush , glcltPopAttrib , glcltPushAttrib , glcltMap1d , glcltMap1f , glcltMap2d , glcltMap2f , glcltMapGrid1d , glcltMapGrid1f , glcltMapGrid2d , glcltMapGrid2f , glcltEvalCoord1d , glcltEvalCoord1dv , glcltEvalCoord1f , glcltEvalCoord1fv , glcltEvalCoord2d , glcltEvalCoord2dv , glcltEvalCoord2f , glcltEvalCoord2fv , glcltEvalMesh1 , glcltEvalPoint1 , glcltEvalMesh2 , glcltEvalPoint2 , glcltAlphaFunc , glcltBlendFunc , glcltLogicOp , glcltStencilFunc , glcltStencilOp , glcltDepthFunc , glcltPixelZoom , glcltPixelTransferf , glcltPixelTransferi , glcltPixelStoref , glcltPixelStorei , glcltPixelMapfv , glcltPixelMapuiv , glcltPixelMapusv , glcltReadBuffer , glcltCopyPixels , glcltReadPixels , glcltDrawPixels , glcltGetBooleanv , glcltGetClipPlane , glcltGetDoublev , glcltGetError , glcltGetFloatv , glcltGetIntegerv , glcltGetLightfv , glcltGetLightiv , glcltGetMapdv , glcltGetMapfv , glcltGetMapiv , glcltGetMaterialfv , glcltGetMaterialiv , glcltGetPixelMapfv , glcltGetPixelMapuiv , glcltGetPixelMapusv , glcltGetPolygonStipple , glcltGetString , glcltGetTexEnvfv , glcltGetTexEnviv , glcltGetTexGendv , glcltGetTexGenfv , glcltGetTexGeniv , glcltGetTexImage , glcltGetTexParameterfv , glcltGetTexParameteriv , glcltGetTexLevelParameterfv , glcltGetTexLevelParameteriv , glcltIsEnabled , glcltIsList , glcltDepthRange , glcltFrustum , glcltLoadIdentity , glcltLoadMatrixf , glcltLoadMatrixd , glcltMatrixMode , glcltMultMatrixf , glcltMultMatrixd , glcltOrtho , glcltPopMatrix , glcltPushMatrix , glcltRotated , glcltRotatef , glcltScaled , glcltScalef , glcltTranslated , glcltTranslatef , glcltViewport , glcltArrayElement , glcltBindTexture , glcltColorPointer , glcltDisableClientState , glcltDrawArrays , glcltDrawElements , glcltEdgeFlagPointer , glcltEnableClientState , glcltIndexPointer , glcltIndexub_InRGBA , glcltIndexubv_InRGBA , glcltInterleavedArrays , glcltNormalPointer , glcltPolygonOffset , glcltTexCoordPointer , glcltVertexPointer , glcltAreTexturesResident , glcltCopyTexImage1D , glcltCopyTexImage2D , glcltCopyTexSubImage1D , glcltCopyTexSubImage2D , glcltDeleteTextures , glcltGenTextures , glcltGetPointerv , glcltIsTexture , glcltPrioritizeTextures , glcltTexSubImage1D , glcltTexSubImage2D , glcltPopClientAttrib , glcltPushClientAttrib , } }; GLCLTPROCTABLE glCltCIProcTable = { /* Number of function entries in the table */ sizeof(GLDISPATCHTABLE) / sizeof(PROC), /* gl Entry points */ { ...
2.ntstubs.c
HWND _CreateWindowEx( DWORD dwExStyle, LPCTSTR pClassName, LPCTSTR pWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu, HANDLE hModule, LPVOID pParam, DWORD dwFlags, LPDWORD pWOW) { ... HWND NtUserCreateWindowEx( IN DWORD dwExStyle, IN PLARGE_STRING pstrClassName, IN PLARGE_STRING pstrWindowName OPTIONAL, IN DWORD dwStyle, IN int x, IN int y, IN int nWidth, IN int nHeight, IN HWND hwndParent, IN HMENU hmenu, IN HANDLE hModule, IN LPVOID pParam, IN DWORD dwFlags, IN LPDWORD pWOW OPTIONAL) { ... PWND xxxCreateWindowExWOW( DWORD dwExStyle, PLARGE_STRING pstrClass, PLARGE_STRING pstrName, DWORD style, int x, int y, int cx, int cy, PWND pwndParent, PMENU pMenu, HANDLE hInstance, LPVOID lpCreateParams, DWORD dwExpWinVerAndFlags, LPDWORD lpWOW) { ...
3.CreateThread
CWinThread::CWinThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam) { m_pfnThreadProc = pfnThreadProc; m_pThreadParams = pParam; CommonConstruct(); } ... BOOL CWinThread::CreateThread(DWORD dwCreateFlags, UINT nStackSize, LPSECURITY_ATTRIBUTES lpSecurityAttrs) { #if !defined(_MT) || defined(_NTSDK) dwCreateFlags; nStackSize; lpSecurityAttrs; return FALSE; #else ASSERT(m_hThread == NULL); // already created? // create thread state AFX_THREAD_STATE* pThreadState = new AFX_THREAD_STATE; if (pThreadState == NULL) return FALSE; // hook up the CWinThread object to the thread state pThreadState->m_pCurrentWinThread = this; // create the thread (it may or may not start to run) m_hThread = (HANDLE)_beginthreadex(lpSecurityAttrs, nStackSize, &_AfxThreadEntry, pThreadState, dwCreateFlags, (UINT*)&m_nThreadID); if (m_hThread == NULL) { // cleanup before returning pThreadState->m_pCurrentWinThread = NULL; delete pThreadState; return FALSE; } return TRUE; #endif //!defined(_MT) || defined(_NTSDK) } ... UINT APIENTRY _AfxThreadEntry(void* pParam) { // initialize the thread state to point to this thread AFX_THREAD_STATE* pThreadState = (AFX_THREAD_STATE*)pParam; CWinThread* pThread = pThreadState->m_pCurrentWinThread; TlsSetValue(_afxThreadTlsIndex, pThreadState); ASSERT(AfxGetThreadState() == pThreadState); ASSERT(AfxGetThread() == pThread); // initialize MFC exception handling #ifndef _AFX_OLD_EXCEPTIONS set_terminate(&AfxStandardTerminate); #endif _set_new_handler(&AfxNewHandler); // thread inherits app's main window if not already set CWnd threadWnd; CWinApp* pApp = AfxGetApp(); ASSERT(pApp != NULL); if (pThread->m_pMainWnd == NULL && pApp->m_pMainWnd->GetSafeHwnd() != NULL) { // just attach the HWND threadWnd.Attach(pApp->m_pMainWnd->m_hWnd); pThread->m_pMainWnd = &threadWnd; } #if !defined(_USRDLL) && !defined(_AFXCTL) // initialize gray dialogs for this thread AFX_WIN_STATE* pWinState = AfxGetWinState(); // initalize window creation hook ASSERT(pThreadState->m_hHookOldCbtFilter == NULL); pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId()); // initialize message filter hook ASSERT(pThreadState->m_hHookOldMsgFilter == NULL); pThreadState->m_hHookOldMsgFilter = ::SetWindowsHookEx(WH_MSGFILTER, (HOOKPROC)_AfxMsgFilterHook, NULL, ::GetCurrentThreadId()); #ifndef _MAC // intialize CTL3D for this thread if (pWinState->m_pfnAutoSubclass != NULL) (*pWinState->m_pfnAutoSubclass)(AfxGetInstanceHandle()); #endif #endif // first -- check for simple worker thread DWORD nResult; if (pThread->m_pfnThreadProc != NULL) { nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams); ASSERT_VALID(pThread); } // else -- check for thread with message loop else if (!pThread->InitInstance()) { ASSERT_VALID(pThread); nResult = pThread->ExitInstance(); } else { // will stop after PostQuitMessage called ASSERT_VALID(pThread); nResult = pThread->Run(); } AfxEndThread(nResult); return 0; // not reached }