308 lines
4.6 KiB
C
308 lines
4.6 KiB
C
|
/*++
|
||
|
|
||
|
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 <precomp.h>
|
||
|
#pragma hdrstop
|
||
|
#include <stdio.h>
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|