/*++ Copyright (c) 1991 Microsoft Corporation Module Name: Profile.c Abstract: This module contains routines for controling the rudimentary sampling profiler built into the profiling version of Ntvdm. Author: Dave Hastings (daveh) 31-Jul-1992 Notes: The routines in this module assume that the pointers to the ntsd routines have already been set up. Revision History: --*/ #include #pragma hdrstop #include VOID ProfDumpp( VOID ) /*++ Routine Description: This routine causes the profile information to be dumped the next time ntvdm switches from 32 to 16 bit mode. Arguments: Return Value: None. Notes: This routine assumes that the pointers to the ntsd routines have already been set up. --*/ { BOOL Status; ULONG Address, Flags; Address = FIXED_NTVDMSTATE_LINEAR; // // Get Flags // Status = READMEM((PVOID)Address, &Flags, sizeof(ULONG)); if (!Status) { (ULONG)Address = (*GetExpression)("ntvdm!InitialVdmTibFlags"); Status = READMEM((PVOID)Address, &Flags, sizeof(ULONG)); if (!Status) { GetLastError(); (*Print)("Could not get InitialVdmTibFlags\n"); return; } } // // Enable profile dump // Flags |= VDM_ANALYZE_PROFILE; Status = WRITEMEM( (PVOID)Address, &Flags, sizeof(ULONG) ); if (!Status) { GetLastError(); (*Print)("Could not set Flags\n"); return; } } VOID ProfIntp( VOID ) /*++ Routine Description: This routine changes the profile interval the next time profiling is started. Arguments: None. Return Value: None. Notes: This routine assumes that the pointers to the ntsd routines have already been set up. --*/ { BOOL Status; ULONG Address, ProfInt; // // Get profile interval // if (sscanf(lpArgumentString, "%ld", &ProfInt) < 1) { (*Print)("Profile Interval must be specified\n"); return; } // // Get the address of the profile interval // Address = (*GetExpression)( "ProfInt" ); if (Address) { Status = WRITEMEM( (PVOID)Address, &ProfInt, sizeof(ULONG) ); if (!Status) { GetLastError(); (*Print)("Could not set profile interval"); } } return; } VOID ProfStartp( VOID ) /*++ Routine Description: This routine causes profiling to start the next time ntvdm switches from 32 to 16 bit mode. Arguments: None. Return Value: None. Notes: This routine assumes that the pointers to the ntsd routines have already been set up. --*/ { BOOL Status; ULONG Address, Flags; Address = FIXED_NTVDMSTATE_LINEAR; // // Get Flags // Status = READMEM( (PVOID)Address, &Flags, sizeof(ULONG) ); if (!Status) { (ULONG)Address = (*GetExpression)("ntvdm!InitialVdmTibFlags"); Status = READMEM( (PVOID)Address, &Flags, sizeof(ULONG) ); if (!Status) { GetLastError(); (*Print)("Could not get InitialTibflags\n"); return; } } // // Enable profiling // Flags |= VDM_PROFILE; Status = WRITEMEM( (PVOID)Address, &Flags, sizeof(ULONG) ); if (!Status) { GetLastError(); (*Print)("Could not get set Flags\n"); return; } } VOID ProfStopp( VOID ) /*++ Routine Description: This routine causes profiling to stop the next time ntvdm switches from 32 to 16 bit mode. Arguments: None. Return Value: None. Notes: This routine assumes that the pointers to the ntsd routines have already been set up. --*/ { BOOL Status; ULONG Address, Flags; Address = FIXED_NTVDMSTATE_LINEAR; // // Get Flags // Status = READMEM((PVOID)Address, &Flags, sizeof(ULONG)); if (!Status) { (ULONG)Address = (*GetExpression)("ntvdm!InitialVdmTibFlags"); Status = READMEM((PVOID)Address, &Flags, sizeof(ULONG)); if (!Status) { GetLastError(); (*Print)("Could not get InitialTibflags\n"); return; } } // // Disable profiling // Flags &= ~VDM_PROFILE; Status = WRITEMEM( (PVOID)Address, &Flags, sizeof(ULONG) ); if (!Status) { GetLastError(); (*Print)("Could not get set VDM Flags in DOS arena\n"); return; } }