/******************************Module*Header*******************************\ * Module Name: ddexts.cxx * * Copyright (c) 2000 Microsoft Corporation * \**************************************************************************/ #include "precomp.hxx" /******************************Public*Routine******************************\ * vPrintDDSURFACE * * Print out DirectDraw surface contents. * * History: * Apr-09-1996 -by- J. Andrew Goossen andrewgo * Wrote it. \**************************************************************************/ #define DDSURFACE_LOCKS 0x00000001 #define DDSURFACE_PUBLIC 0x00000002 #define DDSURFACE_PRIVATE 0x00000004 #define DDSURFACE_DDNEXT 0x00000008 #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 VOID vPrintDDSURFACE( VOID * pvServer, FLONG fl ) { char eSurface[sizeof(EDD_SURFACE)]; char AttachList[sizeof(DD_ATTACHLIST)]; EDD_SURFACE *peSurface; ULONG ul; FLAGDEF *pfd; PDD_ATTACHLIST pAttach; Next_Surface: move2(eSurface, pvServer, sizeof(EDD_SURFACE)); dprintf("EDD_SURFACE structure at 0x%p:\n", pvServer); peSurface = (EDD_SURFACE *)eSurface; if (fl & DDSURFACE_PUBLIC) { dprintf("--------------------------------------------------\n"); dprintf("PDD_SURFACE_GLOBAL lpGbl 0x%lx\n", peSurface->lpGbl); dprintf("PDD_SURFACE_MORE lpMore 0x%lx\n", peSurface->lpSurfMore); ul = peSurface->dwFlags; dprintf("DWORD dwFlags 0x%lx\n", ul); //CHECKLOOP for (pfd = afdDDRAWISURF; pfd->psz; pfd++) if (ul & pfd->fl) dprintf("\t\t\t\t%s\n", pfd->psz); ul = peSurface->ddsCaps.dwCaps; dprintf("DWORD ddsCaps.dwCaps 0x%lx\n", ul); //CHECKLOOP for (pfd = afdDDSCAPS; pfd->psz; pfd++) if (ul & pfd->fl) dprintf("\t\t\t\t%s\n", pfd->psz); ul = peSurface->ddsCapsEx.dwCaps2; dprintf("DWORD ddsCapsEx.dwCaps2 0x%lx\n", ul); //CHECKLOOP for (pfd = afdDDSCAPS2; pfd->psz; pfd++) if (ul & pfd->fl) dprintf("\t\t\t\t%s\n", pfd->psz); dprintf("DWORD dwSurfaceHandle 0x%lx\n", peSurface->dwSurfaceHandle); dprintf("DDCOLORKEY ddckCKSrcBlt/Overlay 0x%lx:0x%lx\n", peSurface->ddckCKSrcOverlay.dwColorSpaceHighValue, peSurface->ddckCKSrcOverlay.dwColorSpaceLowValue); dprintf("DDCOLORKEY ddckCKDestBlt/Overlay 0x%lx:0x%lx\n", peSurface->ddckCKDestOverlay.dwColorSpaceHighValue, peSurface->ddckCKDestOverlay.dwColorSpaceLowValue); dprintf("PDD_ATTACHLIST lpAttachList 0x%lx\n", peSurface->lpAttachList); //CHECKLOOP for (pAttach = peSurface->lpAttachList; pAttach != NULL; pAttach = pAttach->lpLink) { move2(AttachList, pAttach, sizeof(DD_ATTACHLIST)); pAttach = (PDD_ATTACHLIST) AttachList; dprintf(" EDD_SURFACE*\t\t\t0x%lx\n", pedFromLp(pAttach->lpAttached)); if (pAttach->lpLink == pAttach) { dprintf(" !!! Endless lpAttachList loop\n"); break; } if (CheckControlC()) return; } dprintf("PDD_ATTACHLIST lpAttachListFrom 0x%lx\n", peSurface->lpAttachListFrom); //CHECKLOOP for (pAttach = peSurface->lpAttachListFrom; pAttach != NULL; pAttach = pAttach->lpLink) { move2(AttachList, pAttach, sizeof(DD_ATTACHLIST)); pAttach = (PDD_ATTACHLIST) AttachList; dprintf(" EDD_SURFACE*\t\t\t0x%lx\n", pedFromLp(pAttach->lpAttached)); if (pAttach->lpLink == pAttach) { dprintf(" !!! Endless lpAttachListFrom loop\n"); break; } if (CheckControlC()) return; } dprintf("DWORD dwMipMapCount 0x%lx\n", peSurface->dwMipMapCount); dprintf("EDD_VIDEOPORT* peVideoPort 0x%lx\n", peSurface->lpVideoPort != NULL ? pedFromLp(peSurface->lpVideoPort) : 0); dprintf("HBITMAP hbmGdi 0x%lx\n", peSurface->hbmGdi); dprintf("DWORD dwOverlayFlags 0x%lx\n", peSurface->dwOverlayFlags); dprintf("DWORD dwBlockSizeX 0x%lx\n", peSurface->dwBlockSizeX); dprintf("DWORD dwBlockSizeY 0x%lx\n", peSurface->dwBlockSizeY); dprintf("FLATPTR fpVidMem 0x%lx\n", peSurface->fpVidMem); dprintf("LONG lPitch 0x%lx\n", peSurface->lPitch); dprintf("LONG xHint 0x%lx\n", peSurface->xHint); dprintf("LONG yHint 0x%lx\n", peSurface->yHint); dprintf("DWORD wWidth 0x%lx\n", peSurface->wWidth); dprintf("DWORD wHeight 0x%lx\n", peSurface->wHeight); dprintf("DWORD (global) dwReserved1 0x%lx\n", peSurface->DD_SURFACE_GLOBAL::dwReserved1); dprintf("DWORD (local) dwReserved1 0x%lx\n", peSurface->DD_SURFACE_LOCAL::dwReserved1); dprintf("DDPIXELFORMAT ddpfSurface\n"); dprintf(" DWORD dwSize (should be 0x20) 0x%lx\n", peSurface->ddpfSurface.dwSize); ul = peSurface->ddpfSurface.dwFlags; dprintf(" DWORD dwFlags 0x%lx\n", ul); //CHECKLOOP for (pfd = afdDDPIXELFORMAT; pfd->psz; pfd++) if (ul & pfd->fl) dprintf("\t\t\t\t%s\n", pfd->psz); dprintf(" DWORD dwFourCC 0x%lx\n", peSurface->ddpfSurface.dwFourCC); dprintf(" DWORD dwRGB/YUV/ZBuffer/AlphaBitCount 0x%lx\n", peSurface->ddpfSurface.dwRGBBitCount); dprintf(" DWORD dwRBitMask/dwYBitMask 0x%lx\n", peSurface->ddpfSurface.dwRBitMask); dprintf(" DWORD dwGBitMask/dwUBitMask 0x%lx\n", peSurface->ddpfSurface.dwGBitMask); dprintf(" DWORD dwBBitMask/dwVBitMask 0x%lx\n", peSurface->ddpfSurface.dwBBitMask); dprintf(" DWORD dwRGB/YUVAlphaBitMask 0x%lx\n", peSurface->ddpfSurface.dwRGBAlphaBitMask); } if (fl & DDSURFACE_PRIVATE) { dprintf("--------------------------------------------------\n"); dprintf("EDD_SURFACE* peSurface_DdNext 0x%lx\n", peSurface->peSurface_DdNext); dprintf("EDD_SURFACE* peSurface_LockNext 0x%lx\n", peSurface->peSurface_PrimaryLockNext); dprintf("EDD_DIRECTDRAW_GLOBAL* peDirectDrawGlobal 0x%lx\n", peSurface->peDirectDrawGlobal); dprintf("EDD_DIRECTDRAW_LOCAL* peDirectDrawLocal 0x%lx\n", peSurface->peDirectDrawLocal); ul = peSurface->fl; dprintf("FLONG fl 0x%lx\n", ul); //CHECKLOOP for (pfd = afdDDSURFACEFL; pfd->psz; pfd++) if (ul & pfd->fl) dprintf("\t\t\t\t%s\n", pfd->psz); dprintf("ULONG iVisRgnUniqueness 0x%lx\n", peSurface->iVisRgnUniqueness); dprintf("BOOL bLost %s\n", peSurface->bLost ? "TRUE" : "FALSE"); dprintf("HANDLE hSecure 0x%lx\n", peSurface->hSecure); dprintf("ERECTL rclLock: (%li, %li, %li, %li)\n", peSurface->rclLock.left, peSurface->rclLock.top, peSurface->rclLock.right, peSurface->rclLock.bottom); } if (fl & DDSURFACE_LOCKS) { dprintf("--------------------------------------------------\n"); dprintf("ULONG cLocks 0x%lx\n", peSurface->cLocks); dprintf("HDC hdc 0x%lx\n", peSurface->hdc); } if (fl & DDSURFACE_DDNEXT) { if (CheckControlC()) return; pvServer = peSurface->peSurface_DdNext; if (pvServer != NULL) goto Next_Surface; } } #endif // DOES NOT SUPPORT API64 /******************************Public*Routine******************************\ * DECLARE_API( dddsurface ) * * Dumps a DirectDraw surface structure. * \**************************************************************************/ DECLARE_API( dddsurface ) { dprintf("Extension 'dddsurface' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 FLONG fl = 0; ULONG_PTR ddsurface; PARSE_ARGUMENTS(dddsurface_help); if(ntok<1) { goto dddsurface_help; } if(parse_iFindSwitch(tokens, ntok, 'h')!=-1) { goto dddsurface_help; } if(parse_iFindSwitch(tokens, ntok, 'a')!=-1) { fl |= (DDSURFACE_PRIVATE | DDSURFACE_PUBLIC | DDSURFACE_LOCKS); } if(parse_iFindSwitch(tokens, ntok, 'r')!=-1) { fl |= DDSURFACE_PRIVATE; } if(parse_iFindSwitch(tokens, ntok, 'u')!=-1) { fl |= DDSURFACE_PUBLIC; } if(parse_iFindSwitch(tokens, ntok, 'l')!=-1) { fl |= DDSURFACE_LOCKS; } if(parse_iFindSwitch(tokens, ntok, 'n')!=-1) { fl |= DDSURFACE_DDNEXT; } tok_pos = parse_FindNonSwitch(tokens, ntok); if(tok_pos==-1) { goto dddsurface_help; } ddsurface = GetExpression(tokens[tok_pos]); if (fl == 0) { fl |= (DDSURFACE_PRIVATE | DDSURFACE_PUBLIC | DDSURFACE_LOCKS); } vPrintDDSURFACE((PVOID)ddsurface, fl); return; dddsurface_help: dprintf("Usage: dddsurface [-?haruln] ddsurface"); dprintf(" a - all info\n"); dprintf(" r - private info\n"); dprintf(" u - public info\n"); dprintf(" l - locks\n"); dprintf(" n - all surfaces in DdNext link\n"); #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); } /******************************Public*Routine******************************\ * vPrintDDLOCAL * * Print out DirectDraw local object contents. * * History: * Apr-09-1996 -by- J. Andrew Goossen andrewgo * Wrote it. \**************************************************************************/ #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 VOID vPrintDDLOCAL( VOID * pvServer, FLONG fl ) { char pbr[sizeof(EDD_DIRECTDRAW_LOCAL)]; EDD_DIRECTDRAW_LOCAL * peDirectDrawLocal; move2(pbr, pvServer, sizeof(EDD_DIRECTDRAW_LOCAL)); dprintf("EDD_DIRECTDRAW_LOCAL structure at 0x%p:\n",pvServer); peDirectDrawLocal = (EDD_DIRECTDRAW_LOCAL *)pbr; dprintf("--------------------------------------------------\n"); dprintf("FLATPTR fpProcess 0x%lx\n", peDirectDrawLocal->fpProcess); dprintf("--------------------------------------------------\n"); dprintf("EDD_DIRECTDRAW_GLOBAL* peDirectDrawGlobal 0x%lx\n", peDirectDrawLocal->peDirectDrawGlobal); dprintf("EDD_SURFACE* peSurface_DdList 0x%lx\n", peDirectDrawLocal->peSurface_DdList); dprintf("EDD_DIRECTDRAW_LOCAL* peDirectDrawLocalNext 0x%lx\n", peDirectDrawLocal->peDirectDrawLocalNext); dprintf("FLONG fl 0x%lx\n", peDirectDrawLocal->fl); dprintf("HANDLE UniqueProcess 0x%lx\n", peDirectDrawLocal->UniqueProcess); dprintf("PEPROCESS Process 0x%lx\n", peDirectDrawLocal->Process); } #endif // DOES NOT SUPPORT API64 /******************************Public*Routine******************************\ * DECLARE_API( dddlocal ) * \**************************************************************************/ DECLARE_API( dddlocal ) { dprintf("Extension 'dddlocal' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 FLONG fl = 0; ULONG_PTR ddlocal; PARSE_ARGUMENTS(dddlocal_help); if(ntok<1) { goto dddlocal_help; } if(parse_iFindSwitch(tokens, ntok, 'h')!=-1) { goto dddlocal_help; } if(parse_iFindSwitch(tokens, ntok, 'a')!=-1) { fl |= 0; } tok_pos = parse_FindNonSwitch(tokens, ntok); if(tok_pos==-1) { goto dddlocal_help; } ddlocal = GetExpression(tokens[tok_pos]); vPrintDDLOCAL((PVOID)ddlocal, fl); return; dddlocal_help: dprintf("dddlocal [-?] [-h] [-a]\n\n"); dprintf(" a - all info\n"); #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); } /******************************Public*Routine******************************\ * vPrintDDGLOBAL * * Print out DirectDraw global object contents. * * History: * Apr-09-1996 -by- J. Andrew Goossen andrewgo * Wrote it. \**************************************************************************/ #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 VOID vPrintDDGLOBAL( VOID * pvServer, FLONG fl ) { char pbr[sizeof(EDD_DIRECTDRAW_GLOBAL) + 100]; EDD_DIRECTDRAW_GLOBAL * peDirectDrawGlobal; move2(pbr, pvServer, sizeof(EDD_DIRECTDRAW_GLOBAL)); dprintf("EDD_DIRECTDRAW_GLOBAL structure at 0x%p:\n", pvServer); peDirectDrawGlobal = (EDD_DIRECTDRAW_GLOBAL *)pbr; dprintf("--------------------------------------------------\n"); dprintf("VOID* dhpdev 0x%lx\n", peDirectDrawGlobal->dhpdev); dprintf("DWORD dwReserved1 0x%lx\n", peDirectDrawGlobal->dwReserved1); dprintf("DWORD dwReserved2 0x%lx\n", peDirectDrawGlobal->dwReserved2); dprintf("EDD_DIRECTDRAW_LOCAL* peDirectDrawLocalList 0x%lx\n", peDirectDrawGlobal->peDirectDrawLocalList); dprintf("EDD_SURFACE* peSurface_LockList 0x%lx\n", peDirectDrawGlobal->peSurface_PrimaryLockList); dprintf("FLONG fl 0x%lx\n", peDirectDrawGlobal->fl); dprintf("ULONG cSurfaceLocks 0x%lx\n", peDirectDrawGlobal->cSurfaceLocks); dprintf("ULONG cSurfaceAliasedLocks 0x%lx\n", peDirectDrawGlobal->cSurfaceAliasedLocks); dprintf("PKEVENT pAssertModeEvent 0x%lx\n", peDirectDrawGlobal->pAssertModeEvent); dprintf("LONGLONG llAssertModeTimeout 0x%lx\n", (DWORD) peDirectDrawGlobal->llAssertModeTimeout); dprintf("EDD_SURFACE* peSurfaceCurrent 0x%lx\n", peDirectDrawGlobal->peSurfaceCurrent); dprintf("EDD_SURFACE* peSurfacePrimary 0x%lx\n", peDirectDrawGlobal->peSurfacePrimary); dprintf("BOOL bSuspended 0x%lx\n", peDirectDrawGlobal->bSuspended); dprintf("HDEV hdev 0x%lx\n", peDirectDrawGlobal->hdev); dprintf("LONG cDriverReferences 0x%lx\n", peDirectDrawGlobal->cDriverReferences); dprintf("DWORD dwNumHeaps 0x%lx\n", peDirectDrawGlobal->dwNumHeaps); dprintf("VIDEOMEMORY* pvmList 0x%lx\n", peDirectDrawGlobal->pvmList); dprintf("DWORD dwNumFourCC 0x%lx\n", peDirectDrawGlobal->dwNumFourCC); dprintf("DWORD* pdwFourCC 0x%lx\n", peDirectDrawGlobal->pdwFourCC); dprintf("DD_HALINFO HalInfo\n"); dprintf("DD_CALLBACKS CallBacks\n"); dprintf("DD_SURFACECALLBACKS SurfaceCallBacks\n"); dprintf("DD_PALETTECALLBACKS PaletteCallBacks\n"); dprintf("RECTL rclBounds (%ld, %ld), (%ld, %ld)\n", peDirectDrawGlobal->rclBounds.left, peDirectDrawGlobal->rclBounds.top, peDirectDrawGlobal->rclBounds.right, peDirectDrawGlobal->rclBounds.bottom); } #endif // DOES NOT SUPPORT API64 /******************************Public*Routine******************************\ * DECLARE_API( dddglobal ) * \**************************************************************************/ DECLARE_API( dddglobal ) { dprintf("Extension 'dddglobal' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 FLONG fl = 0; ULONG_PTR ddglobal; PARSE_ARGUMENTS(dddglobal_help); if(ntok<1) { goto dddglobal_help; } if(parse_iFindSwitch(tokens, ntok, 'h')!=-1) { goto dddglobal_help; } if(parse_iFindSwitch(tokens, ntok, 'a')!=-1) { fl |= 0; } tok_pos = parse_FindNonSwitch(tokens, ntok); if(tok_pos==-1) { goto dddglobal_help; } ddglobal = GetExpression(tokens[tok_pos]); vPrintDDGLOBAL((PVOID)ddglobal, fl); return; dddglobal_help: dprintf("dddglobal [-?] [-h] [-a]\n\n"); dprintf(" a - all info\n"); #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); } char *pszDdTypes[] = { "DD_DEF_TYPE ", "DD_DIRECTDRAW_TYPE", "DD_SURFACE_TYPE ", "D3D_HANDLE_TYPE ", "DD_VIDEOPORT_TYPE ", "DD_MOTIONCOMP_TYPE", "TOTALS ", "DEF " }; #define DD_TOTAL_TYPE (DD_MAX_TYPE+1) /******************************Public*Routine******************************\ * DECLARE_API( dumpdd ) * * Dumps the count of handles in DdHmgr for each object type. * * History: * 30-Apr-1999 -by- Lindsay Steventon [linstev] * Wrote it. \**************************************************************************/ DECLARE_API( dumpdd ) { dprintf("Extension 'dumpdd' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 PENTRY pent; ULONG gcMaxHmgr; ULONG gcSizeHmgr; ULONG ulLoop; // loop variable ULONG objt; ULONG pulCount[DD_MAX_TYPE + 2]; ULONG cUnknown = 0; ULONG cUnknownSize = 0; ULONG cUnused = 0; ENTRY entry; ULONG HmgCurrentNumberOfObjects[DD_MAX_TYPE + 2] = {0}; ULONG HmgMaximumNumberOfObjects[DD_MAX_TYPE + 2] = {0}; ULONG HmgNumberOfObjectsAllocated[DD_MAX_TYPE + 2] = {0}; ULONG HmgCurrentNumberOfHandles[DD_MAX_TYPE + 2] = {0}; ULONG HmgMaximumNumberOfHandles[DD_MAX_TYPE + 2] = {0}; ULONG HmgNumberOfHandlesAllocated[DD_MAX_TYPE + 2] = {0}; PARSE_ARGUMENTS(dumpdd_help); // Get the pointers and counts from win32k GetValue (pent, "win32k!gpentDdHmgr"); GetValue (gcMaxHmgr, "win32k!gcMaxDdHmgr"); GetValue (gcSizeHmgr, "win32k!gcSizeDdHmgr"); dprintf("Max handles out so far %lu\n", gcMaxHmgr - DD_HMGR_HANDLE_BASE); if (pent == NULL || gcMaxHmgr == 0) { dprintf("terminating: pent = %lx, gcMaxDdHmgr = %lx\n",pent,gcMaxHmgr); return; } // Print out the amount reserved and committed, note we assume a 4K page size dprintf("Total allocated for DdHmgr %lu (%d handles)\n", gcSizeHmgr * sizeof(ENTRY), gcSizeHmgr); //CHECKLOOP for (ulLoop = 0; ulLoop <= DD_TOTAL_TYPE; ulLoop++) { pulCount[ulLoop] = 0; } //CHECKLOOP for (ulLoop = DD_HMGR_HANDLE_BASE; ulLoop < gcMaxHmgr; ulLoop++) { move (entry, &(pent[ulLoop])); objt = (ULONG) entry.Objt; if (objt == DD_DEF_TYPE) { cUnused++; } if (objt > DD_MAX_TYPE) { cUnknown++; } else { pulCount[objt]++; } if (CheckControlC()) return; } dprintf("ulLoop=%d, gcMaxDdHmgr=%d\n", ulLoop, gcMaxHmgr); dprintf("%8s%17s\n","TYPE","Current"); // init the totals pulCount[DD_TOTAL_TYPE] = 0; HmgMaximumNumberOfHandles[DD_TOTAL_TYPE] = 0; // now go through printing each line and accumulating totals for (ulLoop = 0; ulLoop <= DD_MAX_TYPE; ulLoop++) { dprintf("%s%4lu\n", pszDdTypes[ulLoop], pulCount[ulLoop]); if (ulLoop != DD_DEF_TYPE) { pulCount[DD_TOTAL_TYPE] += pulCount[ulLoop]; } if (CheckControlC()) return; } dprintf("%s%4lu\n", pszDdTypes[DD_TOTAL_TYPE], pulCount[DD_TOTAL_TYPE]); dprintf ("\ncUnused objects %lu\n", cUnused); dprintf("cUnknown objects %lu\n",cUnknown); return; dumpdd_help: dprintf("Usage: dumpdd [-?]\n"); dprintf("dumpdd displays the amount of each type of object in the ddraw handle manager\n"); dprintf("-? produces this help\ndumpdd ignores all other arguments\n"); #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); } char *pszDdTypes2[] = { "DEF", "DDRAW", "SURF", "D3DH", "VPE", "MOCOMP" }; /******************************Public*Routine******************************\ * DECLARE_API( dumpddobj ) * * History: * 30-Apr-1999 -by- Lindsay Steventon [linstev] * Wrote it. \**************************************************************************/ DECLARE_API( dumpddobj ) { dprintf("Extension 'dumpddobj' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 PENTRY pent; ULONG gcMaxHmgr; ULONG ulLoop; ENTRY entry; LONG Pid = PID_ALL; LONG Type = TYPE_ALL; BOOL bCheckLock = FALSE; BOOL bSummary = FALSE; int i; PARSE_ARGUMENTS(dumpddobj_help); if(ntok<1) { goto dumpddobj_help; } //find valid tokens - ignore the rest bCheckLock = (parse_iFindSwitch(tokens, ntok, 'l') >= 0); bSummary = (parse_iFindSwitch(tokens, ntok, 's') >= 0); tok_pos = parse_iFindSwitch(tokens, ntok, 'p'); if(tok_pos>=0) { tok_pos++; if((tok_pos+1)>=ntok) { goto dumpddobj_help; //-p requires a pid and it can't be the last arg } Pid = (LONG)GetExpression(tokens[tok_pos]); } //find first non-switch token not preceeded by a -p tok_pos = -1; do { tok_pos = parse_FindNonSwitch(tokens, ntok, tok_pos+1); } while ( (tok_pos!=-1)&&(parse_iIsSwitch(tokens, tok_pos-1, 'p'))); if(tok_pos==-1) { goto dumpddobj_help; } //CHECKLOOP for (Type = 0; Type <= DD_MAX_TYPE; ++Type) { if(parse_iIsToken(tokens, tok_pos, pszDdTypes2[Type])) { break; } } if (Type > DD_MAX_TYPE) { goto dumpddobj_help; } // // Get the pointers and counts from win32k // GetValue(pent, "win32k!gpentDdHmgr"); GetValue(gcMaxHmgr, "win32k!gcMaxDdHmgr"); if (pent == NULL || gcMaxHmgr == 0) { dprintf("terminating: pent = %lx, gcMaxDdHmgr = %lx\n",pent,gcMaxHmgr); return; } // // dprintf out the amount reserved and committed, note we assume a 4K page size // dprintf("object list for %s type objects",Type == TYPE_ALL ? "ALL" : pszDdTypes2[Type]); if (Pid == PID_ALL) { dprintf(" owned by ALL PIDs\n"); } else { dprintf(" owned by PID 0x%lx\n",Pid); } if(!bSummary) { dprintf("%4s, %8s, %6s, %6s, %4s, %8s, %8s, %6s, %6s, %8s,%9s\n", "I","handle","Lock","sCount","pid","pv","objt","unique","Flags","pUser","Tlock"); dprintf("--------------------------------------------------------------------------------------------\n"); } { LONG ObjCount = 0; LONG ObjArray[DD_MAX_TYPE+1]; for(i=0;i<=DD_MAX_TYPE;i++) { ObjArray[i]=0; } //CHECKLOOP for (ulLoop = 0; ulLoop < gcMaxHmgr; ulLoop++) { LONG objt; LONG ThisPid; move(entry, &(pent[ulLoop])); objt = entry.Objt; ThisPid = OBJECTOWNER_PID(entry.ObjectOwner); if ( ((objt == Type) || (Type == TYPE_ALL)) && ((ThisPid == Pid) || (Pid == PID_ALL)) && ((!bCheckLock) || (entry.ObjectOwner.Share.Lock)) ) { ObjCount++; if (!bSummary) { BASEOBJECT baseObj; move(baseObj, entry.einfo.pobj); dprintf("%4lx, %8lx, %6lx, %6lx, %4lx, %8lx, %8s, %6lx, %6lx, %08x, %08lx\n", ulLoop, DD_MAKE_HMGR_HANDLE(ulLoop,entry.FullUnique), (entry.ObjectOwner.Share.Lock != 0), baseObj.ulShareCount, OBJECTOWNER_PID(entry.ObjectOwner), entry.einfo, pszDdTypes2[entry.Objt], entry.FullUnique, entry.Flags, entry.pUser, entry.pUser); } else { ObjArray[entry.Objt]++; } } if (CheckControlC()) return; } if(bSummary && (Type==TYPE_ALL)) { for(i=0;i<=DD_MAX_TYPE; i++) { if(ObjArray[i]>0) { dprintf("%s\t%ld\n", pszDdTypes2[i], ObjArray[i]); } } } dprintf("Total objects = %li\n",ObjCount); } return; dumpddobj_help: dprintf("Usage: dumpddobj [-?] [-p pid] [-l] [-s] object_type\n"); dprintf("-l check lock\n"); dprintf("-s summary\n"); dprintf("\nThe -s option combined with the DEF object type will produce" " a list of the totals for each object type\n"); dprintf("\nValid object_type values are:\n"); for(i=0;i<=DD_MAX_TYPE;i++) { dprintf("%s\n", pszDdTypes2[i]); } #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); } /******************************Public*Routine******************************\ * DECLARE_API( dddh ) * * Debugger extension to dump a handle. * * History: * 30-Apr-1999 -by- Lindsay Steventon [linstev] * Wrote it. \**************************************************************************/ DECLARE_API( dddh ) { dprintf("Extension 'dddh' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 HOBJ ho; // dump this handle PENTRY pent; // base address of hmgr entries ENTRY ent; // copy of handle entry BASEOBJECT obj; ULONG ulTemp; int iRet; PARSE_POINTER(dddh_help); ho = (HOBJ)arg; // Get argument (handle to dump). dprintf("--------------------------------------------------\n"); dprintf("Entry from ghmgr for handle 0x%08lx:\n", ho ); // Dereference the handle via the engine's handle manager. GetAddress(pent, "win32k!gpentDdHmgr"); dprintf("&pent = %lx\n",pent); GetValue(pent, "win32k!gpentDdHmgr"); dprintf("pent = %lx\n",pent); iRet = move(ent, &(pent[DdHmgIfromH((ULONG_PTR) ho)])); dprintf("move() = %lx\n",iRet); // dprintf the entry. BASEOBJECT baseObj; move(baseObj, ent.einfo.pobj); dprintf(" pobj/hfree = 0x%08lx\n" , ent.einfo.pobj); dprintf(" ObjectOwner = 0x%08lx\n" , ent.ObjectOwner.ulObj); dprintf(" pidOwner = 0x%x\n" , OBJECTOWNER_PID(ent.ObjectOwner)); dprintf(" ShareCount = 0x%x\n" , baseObj.ulShareCount); dprintf(" lock = %s\n" , ent.ObjectOwner.Share.Lock ? "LOCKED" : "UNLOCKED"); dprintf(" puser = 0x%x\n" , ent.pUser); dprintf(" objt = 0x%hx\n" , ent.Objt); dprintf(" usUnique = 0x%hx\n" , ent.FullUnique); dprintf(" fsHmgr = 0x%hx\n" , ent.Flags); // If it has an object we get the lock counts and tid owner. if (ent.Objt != DD_DEF_TYPE) { if (ent.einfo.pobj != NULL) { move(obj,ent.einfo.pobj); dprintf(" hHmgr = 0x%08lx\n" , obj.hHmgr); dprintf(" cExcluLock = 0x%08lx\n" , obj.cExclusiveLock); dprintf(" tid = 0x%08lx\n" , obj.Tid); } else { dprintf("It has a NULL pointer\n"); } } ulTemp = (ULONG) ent.Objt; switch(ulTemp) { case DD_DEF_TYPE: dprintf("This is DD_DEF_TYPE\n"); break; case DD_DIRECTDRAW_TYPE: dprintf("This is DD_DIRECTDRAW_TYPE\n"); break; case DD_SURFACE_TYPE: dprintf("This is DD_SURFACE_TYPE\n"); break; case D3D_HANDLE_TYPE: dprintf("This is D3D_HANDLE_TYPE\n"); break; case DD_VIDEOPORT_TYPE: dprintf("This is DD_VIDEOPORT_TYPE\n"); break; case DD_MOTIONCOMP_TYPE: dprintf("This is DD_MOTIONCOMP_TYPE\n"); break; default: dprintf("This is of unknown type - an error\n"); } dprintf("--------------------------------------------------\n"); return; dddh_help: dprintf("Usage: dddh [-?] object_handle\n"); dprintf("-? displays this help\n"); dprintf("object_handle must be in hexadecimal\n"); #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); } /******************************Public*Routine******************************\ * DECLARE_API( dddht ) * * Debugger extension to dump a handle type. * * History: * 21-Feb-1995 -by- Lingyun Wang [lingyunw] * Wrote it. \**************************************************************************/ DECLARE_API( dddht ) { dprintf("Extension 'dddht' is not converted.\n"); #if ENABLE_OLD_EXTS // DOES NOT SUPPORT API64 DWORD dwHandle; PARSE_POINTER(dddht_help); dwHandle = (DWORD)arg; // Get argument (handle to dump). dprintf("Handle: %lx\n",dwHandle); dprintf("\tIndex | UNIQUE | SRV TYPE\n"); dprintf("\t %.4x | %.2x | %.6s (%2x)\n", DdHmgIfromH(dwHandle), (dwHandle & DD_UNIQUE_MASK) >> DD_UNIQUE_SHIFT, pszDdTypes[DdHmgObjtype(dwHandle)], DdHmgObjtype(dwHandle)); return; dddht_help: dprintf("Usage: dddht [-?] object_handle\n"); dprintf("-? displays this help\n"); dprintf("object_handle must be in hexadecimal\n"); #endif // DOES NOT SUPPORT API64 EXIT_API(S_OK); }