summaryrefslogtreecommitdiffstats
path: root/private/mvdm/ieuvddex/i386/vdmtib.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/ieuvddex/i386/vdmtib.c')
-rw-r--r--private/mvdm/ieuvddex/i386/vdmtib.c322
1 files changed, 322 insertions, 0 deletions
diff --git a/private/mvdm/ieuvddex/i386/vdmtib.c b/private/mvdm/ieuvddex/i386/vdmtib.c
new file mode 100644
index 000000000..67e7aeeb2
--- /dev/null
+++ b/private/mvdm/ieuvddex/i386/vdmtib.c
@@ -0,0 +1,322 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ Vdmtib.c
+
+Abstract:
+
+ This module contains routines for manipulating the vdmtib.
+
+Author:
+
+ Dave Hastings (daveh) 1-Apr-1992
+
+Notes:
+
+ The routines in this module assume that the pointers to the ntsd
+ routines have already been set up.
+
+Revision History:
+
+--*/
+
+#include <stdio.h>
+#include <ieuvddex.h>
+
+VOID
+VdmTibp(
+ IN HANDLE CurrentProcess,
+ IN HANDLE CurrentThread,
+ IN LPSTR ArgumentString
+ )
+/*++
+
+Routine Description:
+
+ This routine dumps out the contents of the register block, and
+ event info from the vdmtib. If no address is specified (normal case),
+ then the vdmtib is looked up (symbol VdmTib).
+
+Arguments:
+
+ CurrentProcess -- Supplies a handle to the current process
+ CurrentThread -- Supplies a handle to the current thread
+ ArgumentString -- Supplies a pointer to the commands argument string
+
+Return Value:
+
+ None.
+
+Notes:
+
+ This routine assumes that the pointers to the ntsd routines have already
+ been set up.
+
+--*/
+{
+ BOOL Status;
+ ULONG Address, BytesRead;
+ CONTEXT Context;
+ VDMEVENTINFO EventInfo;
+
+ UNREFERENCED_PARAMETER(CurrentThread);
+
+ //
+ // Get the address of the vdmtib
+ //
+ if (sscanf(ArgumentString,"%lx",&Address) < 0) {
+ Address = (*GetExpression)(
+ "ntvdm!VdmTib"
+ );
+ }
+
+ if (!Address) {
+ (*Print)("Error geting VdmTib address\n");
+ return;
+ }
+
+ //
+ // Get the 32 bit context and print it out
+ //
+
+ Status = ReadProcessMem(
+ CurrentProcess,
+ &(((PVDM_TIB)Address)->MonitorContext),
+ &Context,
+ sizeof(CONTEXT),
+ &BytesRead
+ );
+
+ if ((!Status) || (BytesRead != sizeof(CONTEXT))) {
+ GetLastError();
+ (*Print)("Could not get MonitorContext\n");
+ } else {
+ (*Print)("\n32 bit context\n");
+ PrintContext(&Context);
+ }
+
+ //
+ // Get the 16 bit context and print it out
+ //
+
+ Status = ReadProcessMem(
+ CurrentProcess,
+ &(((PVDM_TIB)Address)->VdmContext),
+ &Context,
+ sizeof(CONTEXT),
+ &BytesRead
+ );
+
+ if ((!Status) || (BytesRead != sizeof(CONTEXT))) {
+ GetLastError();
+ (*Print)("Could not get VdmContext\n");
+ } else {
+ (*Print)("\n16 bit context\n");
+ PrintContext(&Context);
+ }
+
+ //
+ // Get the event info and print it out
+ //
+
+ Status = ReadProcessMem(
+ CurrentProcess,
+ &(((PVDM_TIB)Address)->EventInfo),
+ &EventInfo,
+ sizeof(VDMEVENTINFO),
+ &BytesRead
+ );
+
+ if ((!Status) || (BytesRead != sizeof(VDMEVENTINFO))) {
+ GetLastError();
+ (*Print)("Could not get EventInfo\n");
+ } else {
+ (*Print)("\nEvent Info\n");
+ PrintEventInfo(&EventInfo);
+ }
+}
+
+VOID
+EventInfop(
+ IN HANDLE CurrentProcess,
+ IN HANDLE CurrentThread,
+ IN LPSTR ArgumentString
+ )
+/*++
+
+Routine Description:
+
+ This routine dumps the contents of an event info structure. If no
+ address is specifed (normal case), the event info from the Vdmtib is
+ dumped.
+
+Arguments:
+
+ CurrentProcess -- Supplies a handle to the current process
+ CurrentThread -- Supplies a handle to the current thread
+ ArgumentString -- Supplies a pointer to the commands argument string
+
+Return Value:
+
+ None.
+
+Notes:
+
+ This routine assumes that the pointers to the ntsd routines have already
+ been set up.
+
+--*/
+{
+ BOOL Status;
+ ULONG Address, BytesRead;
+ VDMEVENTINFO EventInfo;
+
+ UNREFERENCED_PARAMETER(CurrentThread);
+
+ //
+ // Get the address of the eventinfo
+ //
+ if (sscanf(ArgumentString,"%lx",&Address) < 0) {
+ Address = (*GetExpression)(
+ "ntvdm!VdmTib"
+ );
+ Address = (ULONG)(&(((PVDM_TIB)Address)->EventInfo));
+ }
+
+ if (!Address) {
+ (*Print)("Error geting VdmTib address\n");
+ return;
+ }
+
+ //
+ // Get the event info and print it out
+ //
+
+ Status = ReadProcessMem(
+ CurrentProcess,
+ (PVOID)Address,
+ &EventInfo,
+ sizeof(VDMEVENTINFO),
+ &BytesRead
+ );
+
+ if ((!Status) || (BytesRead != sizeof(VDMEVENTINFO))) {
+ GetLastError();
+ (*Print)("Could not get EventInfo\n");
+ } else {
+ (*Print)("\nEvent Info\n");
+ PrintEventInfo(&EventInfo);
+ }
+}
+
+VOID
+PrintEventInfo(
+ IN PVDMEVENTINFO EventInfo
+ )
+/*++
+
+Routine Description:
+
+ This routine prints out the contents of an event info structure
+
+Arguments:
+
+ EventInfo -- Supplies a pointer to the eventinfo
+
+Return Value:
+
+ None.
+
+--*/
+{
+ switch (EventInfo->Event) {
+ case VdmIO :
+
+ (*Print)("IO Instruction Event\n");
+
+ if (EventInfo->IoInfo.Read) {
+ (*Print)("Read from ");
+ } else {
+ (*Print)("Write to ");
+ }
+
+ switch (EventInfo->IoInfo.Size) {
+ case 1 :
+ (*Print)("Byte port ");
+ break;
+ case 2 :
+ (*Print)("Word port ");
+ break;
+ case 4 :
+ (*Print)("Dword port ");
+ break;
+ default:
+ (*Print)("Unknown size port ");
+ }
+
+ (*Print)(" number %x\n", EventInfo->IoInfo.PortNumber);
+ break;
+
+ case VdmStringIO :
+
+ (*Print)("String IO Instruction Event\n");
+
+ if (EventInfo->StringIoInfo.Read) {
+ (*Print)("Read from ");
+ } else {
+ (*Print)("Write to ");
+ }
+
+ switch (EventInfo->StringIoInfo.Size) {
+ case 1 :
+ (*Print)("Byte port ");
+ break;
+ case 2 :
+ (*Print)("Word port ");
+ break;
+ case 4 :
+ (*Print)("Dword port ");
+ break;
+ default:
+ (*Print)("Unknown size port ");
+ }
+
+ (*Print)(" number %x, ", EventInfo->StringIoInfo.PortNumber);
+ (*Print)(
+ " Count = %lx, Address = %lx\n",
+ EventInfo->StringIoInfo.Count,
+ EventInfo->StringIoInfo.Address
+ );
+ break;
+
+ case VdmIntAck :
+
+ (*Print)("Interrupt Acknowlege Event\n");
+ break;
+
+ case VdmBop:
+
+ (*Print)("Bop Event\n");
+ (*Print)("Bop number %x\n",EventInfo->BopNumber);
+ break;
+
+ case VdmError :
+
+ (*Print)("Error Event\n");
+ (*Print)("Error Status %lx\n",EventInfo->ErrorStatus);
+
+ case VdmIrq13 :
+
+ (*Print)("IRQ 13 Event\n");
+ break;
+
+ default:
+
+ (*Print)("Unknown Event %x\n",EventInfo->Event);
+
+ }
+
+}