windows-nt/Source/XPSP1/NT/ds/dns/dnsexts/dnsexts.cxx
2020-09-26 16:20:57 +08:00

305 lines
5.7 KiB
C++

/*******************************************************************
*
* File : dnsexts.cxx
* Author : Eyal Schwartz
* Copyrights : Microsoft Corp (C) 1996
* Date : 7/14/1998
* Description : dnsext.dll debugger extension.
*
* Revisions : <date> <name> <description>
*******************************************************************/
#ifndef DNSEXTS_CXX
#define DNSEXTS_CXX
// include //
// #include <dns.h>
#include "common.h"
#include "dump.hxx"
#include "util.hxx"
#include <ntverp.h>
#include <string.h>
// defines //
// types //
// global variables //
PNTSD_EXTENSION_APIS glpExtensionApis=NULL;
LPSTR glpArgumentString=NULL;
HANDLE ghCurrentProcess=NULL;
LPVOID gCurrentAllocation=NULL;
// prototypes //
INT GetDumpTableIndex(LPSTR szName);
DWORD ExceptionHandler(DWORD dwException);
// functions //
/*+++
Function : DllAttach
Description: initializes the library upon attach
Parameters : none.
Return :
Remarks : none.
---*/
BOOL DllAttach(void)
{
INT i=0;
BOOL bRet=TRUE;
//
// Nothing to do yet
//
return bRet;
}
/*+++
Function : DllDetach
Description: initializes the library upon attach
Parameters : none.
Return :
Remarks : none.
---*/
BOOL DllDetach(void)
{
BOOL bRet=TRUE;
//
// Nothing to do yet
//
return bRet;
}
/*+++
Function : ExceptionHandler
Description:
Parameters :
Return :
Remarks : none.
---*/
DWORD ExceptionHandler(DWORD dwException){
Printf("Exception 0x%x: dnsexts exception failure\n", dwException);
CleanMemory();
return EXCEPTION_EXECUTE_HANDLER;
}
/*+++
Function : help
Description: dump usage
Parameters : as specified in ntdsexts.h
Return :
Remarks : none.
---*/
PNTSD_EXTENSION_ROUTINE (help)(
HANDLE hCurrentProcess,
HANDLE hCurrentThread,
DWORD dwCurrentPc,
PNTSD_EXTENSION_APIS lpExtensionApis,
LPSTR lpArgumentString
)
{
ASSIGN_NTSDEXTS_GLOBAL(lpExtensionApis, lpArgumentString, hCurrentProcess);
Printf("dnsexts usage (version %s):\n", VER_PRODUCTVERSION_STR);
Printf(" help: this help screen.\n");
Printf(" dump <DATATYPE> <ADDRESS>: dumps structure at <address> in <DATATYPE> format.\n");
Printf("---\n");
return 0;
}
/*+++
Function : GetDumpTableIndex
Description: Get index into dump table if the entry by that name exist
Parameters : szName: function name to find
Return : -1 if failed, otherwise index value
Remarks : none.
---*/
INT GetDumpTableIndex(LPSTR szName)
{
INT i=0;
for(i=0;i<gcbDumpTable; i++){
if(!_stricmp(szName,gfDumpTable[i].szName)){
return i;
}
}
return -1;
}
/*+++
Function : dump
Description: dumps give data structure
Parameters : as specified in ntdsexts.h
Return :
Remarks : command line gives structure name & hex value
---*/
PNTSD_EXTENSION_ROUTINE (dump)(
HANDLE hCurrentProcess,
HANDLE hCurrentThread,
DWORD dwCurrentPc,
PNTSD_EXTENSION_APIS lpExtensionApis,
LPSTR lpArgumentString
)
{
__try{
INT i=0; // generic index
//
// make interface availabe globally
//
ASSIGN_NTSDEXTS_GLOBAL(lpExtensionApis, lpArgumentString, hCurrentProcess);
DEBUG1("DEBUG: Argstring=[%s]\n", lpArgumentString);
//
// process argument string
//
//
// Format: DATATYPE ADDRESS
//
LPVOID lpVoid=0x0;
const LPSTR cDelimiters=" \t";
LPSTR szDataType = NULL, szAddress=NULL;
if(NULL != (szDataType = strtok(lpArgumentString, cDelimiters)) &&
NULL != (szAddress = strtok(NULL, cDelimiters)) &&
NULL == strtok(NULL, cDelimiters) ||
((szDataType != NULL && szAddress == NULL && !_stricmp(szDataType,"HELP")))){
//
// Got all arguments
//
if(szAddress != NULL){
lpVoid = (LPVOID)GetExpr(szAddress);
}
//
// BUGBUG: DEBUG!
//
DEBUG1("DEBUG: szDataType=[%s]\n", szDataType);
DEBUG1("DEBUG: szAddress=[%s]\n", szAddress);
DEBUG1("DEBUG: lpVoid =[%p]\n", lpVoid);
//
// find in function table & call function
//
if(0 > (i = GetDumpTableIndex(szDataType))){
Printf("Usage error: Cannot find function %s. Type dnsexts.dump help.\n", szDataType);
}
else{
//
// call function
//
BOOL bRet=TRUE;
bRet = gfDumpTable[i].function(lpVoid);
if(!bRet){
Printf("Error: function %s failed\n", szDataType);
}
}
}
else{
//
// error
//
Printf("Usage error (2). Type dnsexts.dump help.\n");
}
} // try-except
__except(ExceptionHandler(GetExceptionCode())){
Printf("Aborting dump funtion\n");
}
return 0;
}
////////////////////// ENTRY POINT //////////////////////
/*+++
Function : DllMain
Description: <<<DLL entry point>>>
Parameters : standard DllMain
Return : init success bool
Remarks : none.
---*/
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
BOOL bRet = TRUE;
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
bRet = DllAttach();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
bRet = DllDetach();
break;
}
return bRet;
}
#endif
/******************* EOF *********************/