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;
|
|
}
|
|
}
|