//======================================================
// DiscoverBytePointerPosInModules Function
Definition.
//======================================================
static VOID ExamineUserModule( IN
VAD* pvadMatchingNode, IN BYTE* pbBytePointer, IN BOOLEAN bTouchPages, IN ULONG
ulSizeOfSzImageName, OUT VOID** P_pvMatchingModuleStart, OUT ULONG*
P_ulMatchingModuleLength, OUT IMAGE_NT_HEADERS** P_pinhMatchingModuleNtHeaders,
OUT CHAR* P_szImageName )
{
����� DWORD ����������� ����� dwImageBase;
����� IMAGE_DOS_HEADER*����� pidhDosHdr;
����� IMAGE_NT_HEADERS*����� pinhNtHdrs;
����� DWORD*����������� ����� ����� pdwDwordPtr;
����� WORD* ����������� ����� pwImageNameLengthPtr;
����� WORD� ����������� ����� wImageNameLength;
����� DWORD*����������� ����� ����� pdwImageNameUnicodePtrPtr;
����� WORD* ����������� ����� pwImageNameUnicodePtr;
����� WORD* ����������� ����� pwWordPtr;
����� CHAR* ����������� ����� pcCharPtr;
����� ULONG ����������� ����� ulI;
����� //
Check the Flags of the Matching Node.
����� if
( ( pvadMatchingNode->dwFlags & 0x80000000 ) == 0 &&
����� ����� ( pvadMatchingNode->dwFlags & 0x00100000 ) )
����� {
����� ����� dwImageBase = ( (DWORD) pvadMatchingNode->pvStartingAddress
) << 12;
����� ����� // Check the DOS Header.
����� ����� pidhDosHdr = (IMAGE_DOS_HEADER*) dwImageBase;
����� ����� if (
IsPagePresentAndTouch_BYTERANGE( (BYTE*) pidhDosHdr, sizeof(
IMAGE_DOS_HEADER ), bTouchPages ) )
����� ����� {
����������� ����� if ( pidhDosHdr->e_magic ==
IMAGE_DOS_SIGNATURE &&
����������� ����� ����� pidhDosHdr->e_lfarlc
>= 0x40 )
����������� ����� {
����������� ����� ����� // Check the NT Headers.
����������� ����� ����� pinhNtHdrs =
(IMAGE_NT_HEADERS*) ( dwImageBase + pidhDosHdr->e_lfanew );
����������� ����� ����� if ( IsPagePresentAndTouch_BYTERANGE( (BYTE*)
pinhNtHdrs, sizeof( IMAGE_NT_HEADERS ),
bTouchPages ) )
����������� ����� ����� {
����������� ����������� ����� if ( pinhNtHdrs->Signature == IMAGE_NT_SIGNATURE )
����������� ����������� ����� {
����������� ����������� ����� ����� if (
pbBytePointer == NULL ||
����������� ����������� ����������� ����� ((DWORD)pbBytePointer) <= dwImageBase +
pinhNtHdrs->OptionalHeader.SizeOfImage - 1 )
����������� ����������� ����� ����� {
����������� ����������� ����������� ����� // Setup the
Variables required later.
����������� ����������� ����������� ����� * P_pvMatchingModuleStart = (VOID*)
dwImageBase;
����������� ����������� ����������� ����� * P_ulMatchingModuleLength =
pinhNtHdrs->OptionalHeader.SizeOfImage;
����������� ����������� ����������� ����� * P_pinhMatchingModuleNtHeaders =
pinhNtHdrs;
����������� ����������� ����������� ����� // Get the Full
Name of the Specified Module.
����������� ����������� ����������� ����� if (
pvadMatchingNode->dwUndocumented_DWORD )
����������� ����������� ����������� ����� {
����������� ����������� ����������� ����� ����� pdwDwordPtr
= (DWORD*) ( pvadMatchingNode->dwUndocumented_DWORD +
MACRO_VADTREE_UNDOCUMENTED_DISP_0 );
����������� ����������� ����������� ����� ����� if ( IsPagePresentAndTouch_DWORD( pdwDwordPtr,
bTouchPages ) )
����������� ����������� ����������� ����� ����� {
����������� ����������� ����������� ����������� ����� pwImageNameLengthPtr
= (WORD*) ( *pdwDwordPtr + MACRO_VADTREE_UNDOCUMENTED_DISP_1 );
����������� ����������� ����������� ����������� ����� // Get the Full Name of the Module.
����������� ����������� ����������� ����������� ����� if ( IsPagePresentAndTouch_WORD(
pwImageNameLengthPtr, bTouchPages ) )
����������� ����������� ����������� ����������� ����� {
����������� ����������� ����������� ����������� ����� ����� wImageNameLength = * pwImageNameLengthPtr
/ sizeof( WORD );
����������� ����������� ����������� ����������� ����� ����� if (
wImageNameLength != 0 &&
����������� ����������� ����������� ����������� ����������� ����� wImageNameLength <= ulSizeOfSzImageName
- 1 )
����������� ����������� ����������� ����������� ����� ����� {
����������� ����������� ����������� ����������� ����������� ����� pdwImageNameUnicodePtrPtr = (DWORD*) (
*pdwDwordPtr +
����������� ����������� ����������� ����������� ����������� ����� ����� MACRO_VADTREE_UNDOCUMENTED_DISP_1
+ FIELD_OFFSET( UNICODE_STRING, Buffer ) );
����������� ����������� ����������� ����������� ����������� ����� if (
IsPagePresentAndTouch_DWORD( pdwImageNameUnicodePtrPtr, bTouchPages ) )
����������� ����������� ����������� ����������� ����������� ����� {
����������� ����������� ����������� ����������� ����������� ����� ����� pwImageNameUnicodePtr
= (WORD*) * pdwImageNameUnicodePtrPtr;
����������� ����������� ����������� ����������� ����������� ����� ����� if ( pwImageNameUnicodePtr != NULL &&
����� ����� ����������� ����������� ����������� ����������� ����������� ����� IsPagePresentAndTouch(
pwImageNameUnicodePtr, bTouchPages ) &&
����������� ����������� ����������� ����������� ����������� ����������� ����� IsPagePresentAndTouch_WORD(
pwImageNameUnicodePtr + wImageNameLength - 1, bTouchPages ) )
����������� ����������� ����������� ����������� ����������� ����� ����� {
����������� ����������� ����������� ����������� ����������� ����������� ����� pwWordPtr
= pwImageNameUnicodePtr;
����������� ����������� ����������� ����������� ����������� ����������� ����� pcCharPtr
= P_szImageName;
����������� ����������� ����������� ����������� ����������� ����������� ����� for ( ulI = 0; ulI < wImageNameLength; ulI ++ )
����������� ����������� ����������� ����������� ����������� ����������� ����� ����� * pcCharPtr ++ = (CHAR) ( ( * pwWordPtr ++
) & 0xFF );
����������� ����������� ����������� ����������� ����������� ����������� ����� *
pcCharPtr = '\0';
����������� ����������� ����������� ����������� ����������� ����� ����� }
����������� ����������� ����������� ����������� ����������� ����� }
����������� ����������� ����������� ����������� ����� ����� }
����������� ����������� ����������� ����������� ����� }
����������� ����������� ����������� ����� ����� }
����������� ����������� ����������� ����� }
����������� ����������� ����� ����� }
����������� ����������� ����� }
����������� ����� ����� }
����������� ����� }
����� ����� }
����� }
����� //
Return to the Caller.
����� return;
}
typedef struct
_VADTREEWALKFN_PARAMS
{
����� /*IN*/
BYTE*������ ����������� ����� ����� pbBytePointer;
����� /*IN*/
BOOLEAN���� ����������� ����������� ����� bTouchPages;
����� /*IN*/
PFNUSERMODULESNAMELISTENUM����� pfnUserModListCallBack;
����� /*IN*/
BOOLEAN*��� ����������� ����������� ����� pbExitNOW;
����� /*IN*/
DWORD������ ����������� ����� ����� dwUserModListCallBackPARAM;
} VADTREEWALKFN_PARAMS, *PVADTREEWALKFN_PARAMS;
static BOOLEAN
InvokeUserModListCallBack( OUT VAD** ppvRetVal, IN VAD* pvadNode, IN
VADTREEWALKFN_PARAMS* ppParams )
{
����� CHAR� ����������� ����� szImageName[ 256 ] = "";
����� VOID* ����������� ����� pvMatchingModuleStart = NULL;
����� ULONG ����������� ����� ulMatchingModuleLength = 0;
����� IMAGE_NT_HEADERS*����� pinhMatchingModuleNtHeaders = NULL;
����� //
Invoke the Callback Function.
����� ExamineUserModule( pvadNode,
NULL, ppParams->bTouchPages, sizeof(
szImageName ),
����� ����� & pvMatchingModuleStart, & ulMatchingModuleLength,
& pinhMatchingModuleNtHeaders, szImageName );
����� if
( strlen( szImageName ) && pvMatchingModuleStart &&
ulMatchingModuleLength && pinhMatchingModuleNtHeaders )
����� ����� if (
ppParams->pfnUserModListCallBack( szImageName, pvMatchingModuleStart,
ulMatchingModuleLength, pinhMatchingModuleNtHeaders,
ppParams->dwUserModListCallBackPARAM ) == FALSE )
����� ����� {
����������� ����� * ppParams->pbExitNOW = TRUE;
����������� ����� * ppvRetVal = NULL;
����������� ����� return TRUE;
����� ����� }
����� return
FALSE;
}
static VAD* VadTreeWalk( IN VAD*
pvadNode, IN VADTREEWALKFN_PARAMS* ppParams )
{
����� VAD*� ����� pvadTemp;
����� DWORD ����� dwStart, dwEnd;
����� //
Check this Node.
����� if
( pvadNode == NULL ||
����� ����� IsPagePresentAndTouch_BYTERANGE( (BYTE*) pvadNode, sizeof( VAD ), ppParams->bTouchPages ) == FALSE )
����������� ����� return NULL;
����� pvadTemp = VadTreeWalk(
pvadNode->pvadLeftLink, ppParams );
����� if
( pvadTemp )
����� ����� return pvadTemp;
����� dwStart = ( (DWORD)
pvadNode->pvStartingAddress ) << 12;
����� dwEnd = ( ( ( (DWORD)
pvadNode->pvEndingAddress ) + 1 ) << 12 ) - 1;
����� if
( ppParams->pbBytePointer &&
����� ����� ( (DWORD) ppParams->pbBytePointer ) >= dwStart &&
����� ����� ( (DWORD) ppParams->pbBytePointer ) <= dwEnd )
����� {
����� ����� return pvadNode;
����� }
����� else
if( ppParams->pfnUserModListCallBack )
����� {
����� ����� if ( * ppParams->pbExitNOW )
����������� ����� return NULL;
����� ����� if ( InvokeUserModListCallBack(
& pvadTemp, pvadNode, ppParams ) )
����������� ����� return pvadTemp;
����� }
����� pvadTemp = VadTreeWalk(
pvadNode->pvadRightLink, ppParams );
����� if
( pvadTemp )
����� ����� return pvadTemp;
����� return
NULL;
}
VOID DiscoverBytePointerPosInModules( OUT CHAR* pszOutputBuffer, IN
BYTE* pbBytePointer, IN VOID* pvNtoskrnlDriverSection, IN VOID*
pvMmUserProbeAddress, IN VOID* pvPCRAddress, IN OUT DISCVBPTR_ADDPARAMS*
pdbpAddParams )
{
����� VOID* ����������� ����� pvMatchingModuleStart;
����� ULONG ����������� ����� ulMatchingModuleLength;
����� IMAGE_NT_HEADERS*����� pinhMatchingModuleNtHeaders;
����� WORD* ����������� ����� pwImageNameLengthPtr;
����� WORD� ����������� ����� wImageNameLength;
����� WORD* ����������� ����� pwWordPtr;
����� CHAR* ����������� ����� pcCharPtr;
����� ULONG ����������� ����� ulI;
����� WORD* ����������� ����� pwImageNameUnicodePtr;
����� DWORD*����������� ����� ����� pdwImageNameUnicodePtrPtr;
����� DWORD ����������� ����� dwImageBase;
����� IMAGE_DOS_HEADER*����� pidhDosHdr;
����� IMAGE_NT_HEADERS*����� pinhNtHdrs;
����� BOOLEAN���������� ����� ����� bTouchPages = FALSE;
����� CHAR� ����������� ����� szSectionName[ 64 ];
����� CHAR� ����������� ����� szImageName[ 256 ];
����� BOOLEAN���������� ����� ����� bVadWalkExit;
����� VADTREEWALKFN_PARAMS����� vtwfpWalkParams;
����� if
( pdbpAddParams && pdbpAddParams->bTouchPages )
����� ����� bTouchPages = TRUE;
����� if
( pszOutputBuffer )
����� ����� strcpy( pszOutputBuffer, ""
);
����� if
( pdbpAddParams )
����� {
����� ����� pdbpAddParams->bIsBytePointerAtTheBeginning = FALSE;
����� }
����� //
Check whether the Pointer refers to User Memory or Kernel Memory.
����� pvMatchingModuleStart = NULL;
����� ulMatchingModuleLength = 0;
����� pinhMatchingModuleNtHeaders =
NULL;
����� strcpy( szImageName, "" );
����� if
( (DWORD) pbBytePointer < (DWORD) pvMmUserProbeAddress )
����� {
����� ����� BYTE* ����� ����� pbPcr
= (BYTE*) pvPCRAddress;
����� ����� BYTE* ����� ����� pbKteb;
����� ����� BYTE* ����� ����� pbKpeb;
����� ����� VAD*� ����� ����� pvadVadRoot;
����� ����� VAD*� ����� ����� pvadMatchingNode;
����� ����� DWORD ����� ����� dwDword;
����� ����� //
����� ����� // USER SPACE.
����� ����� //
����� ����� // Get the Root Address of the VAT.
����� ����� pbKteb = (BYTE*) ( * (DWORD*) ( pbPcr +
MACRO_KTEBPTR_FIELDOFFSET_IN_PCR ) );
����� ����� if ( pbKteb )
����� ����� {
����������� ����� if ( pdbpAddParams &&
pdbpAddParams->pbKpeb )
����������� ����� ����� pbKpeb =
pdbpAddParams->pbKpeb;
����������� ����� else
����������� ����� ����� pbKpeb = (BYTE*) ( *
(DWORD*) ( pbKteb + MACRO_KPEBPTR_FIELDOFFSET_IN_KTEB ) );
����������� ����� if ( pbKpeb )
����������� ����� {
����������� ����� ����� pvadVadRoot = (VAD*)
( * (DWORD*) ( pbKpeb + MACRO_VADROOT_FIELDOFFSET_IN_KPEB ) );
����������� ����� ����� if ( pvadVadRoot )
����������� ����� ����� {
����������� ����������� ����� if ( IsPagePresentAndTouch_BYTERANGE( (BYTE*)
pvadVadRoot, sizeof( VAD ), bTouchPages ) )
����������� ����������� ����� {
����������� ����������� ����� ����� bVadWalkExit = FALSE;
����������� ����������� ����� ����� vtwfpWalkParams.pbBytePointer =
pbBytePointer;
����������� ����������� ����� ����� vtwfpWalkParams.bTouchPages = bTouchPages;
����������� ����������� ����� ����� vtwfpWalkParams.pfnUserModListCallBack =
pdbpAddParams && pdbpAddParams->pfnUserModListCallBack ?
pdbpAddParams->pfnUserModListCallBack : NULL;
����������� ����������� ����� ����� vtwfpWalkParams.pbExitNOW = &
bVadWalkExit;
����������� ����������� ����� ����� vtwfpWalkParams.dwUserModListCallBackPARAM
= pdbpAddParams ? pdbpAddParams->dwUserModListCallBackPARAM : 0;
����������� ����������� ����� ����� pvadMatchingNode = VadTreeWalk(
pvadVadRoot, & vtwfpWalkParams );
����������� ����������� ����� ����� if (
pvadMatchingNode )
����������� ����������� ����������� ����� ExamineUserModule( pvadMatchingNode,
pbBytePointer, bTouchPages, sizeof( szImageName
),
����������� ����������� ����������� ����� ����� &
pvMatchingModuleStart, & ulMatchingModuleLength, &
pinhMatchingModuleNtHeaders, szImageName );
����������� ����������� ����� }
����������� ����� ����� }
����������� ����� }
����� ����� }
����� }
����� else
����� {
����� ����� LIST_ENTRY*������ ����� pleListNodePtr;
����� ����� DWORD*����������� ����� ����� pdwImageBasePtr;
����� ����� //
����� ����� // KERNEL SPACE.
����� ����� //
����� ����� pleListNodePtr = (LIST_ENTRY*) pvNtoskrnlDriverSection;
����� ����� while( TRUE )
����� ����� {
����������� ����� if ( pleListNodePtr == NULL )
����������� ����� ����� break;
����������� ����� // Check the Module Start Address.
����������� ����� pdwImageBasePtr = (DWORD*) ( ( (BYTE*) pleListNodePtr ) +
MACRO_IMAGEBASE_FIELDOFFSET_IN_DRVSEC );
����������� ����� if (
IsPagePresentAndTouch_DWORD( pdwImageBasePtr, bTouchPages ) )
����������� ����� {
����������� ����� ����� dwImageBase = *
pdwImageBasePtr;
����������� ����� ����� // Compare the Image Base and the Specified Pointer.
����������� ����� ����� if ( ( (DWORD) pbBytePointer ) >= dwImageBase )
����������� ����� ����� {
����������� ����������� ����� // Check the DOS Header.
����������� ����������� ����� pidhDosHdr =
(IMAGE_DOS_HEADER*) dwImageBase;
����������� ����������� ����� if ( IsPagePresentAndTouch_BYTERANGE( (BYTE*)
pidhDosHdr, sizeof( IMAGE_DOS_HEADER ),
bTouchPages ) )
����������� ����������� ����� {
����������� ����������� ����� ����� if (
pidhDosHdr->e_magic == IMAGE_DOS_SIGNATURE &&
����������� ����������� ����������� ����� pidhDosHdr->e_lfarlc >= 0x40 )
����������� ����������� ����� ����� {
����������� ����������� ����������� ����� // Check the NT
Headers.
����������� ����������� ����������� ����� pinhNtHdrs = (IMAGE_NT_HEADERS*) (
dwImageBase + pidhDosHdr->e_lfanew );
����������� ����������� ����������� ����� if (
IsPagePresentAndTouch_BYTERANGE( (BYTE*) pinhNtHdrs, sizeof(
IMAGE_NT_HEADERS ), bTouchPages ) )
����������� ����������� ����������� ����� {
����������� ����������� ����������� ����� ����� if ( pinhNtHdrs->Signature == IMAGE_NT_SIGNATURE )
����������� ����������� ����������� ����� ����� {
����������� ����������� ����������� ����������� ����� if ( ( (DWORD) pbBytePointer ) <= dwImageBase +
pinhNtHdrs->OptionalHeader.SizeOfImage - 1 )
����������� ����������� ����������� ����������� ����� {
����������� ����������� ����������� ����������� ����� ����� // Setup the
Variables required later.
����������� ����������� ����������� ����������� ����� ����� pvMatchingModuleStart = (VOID*)
dwImageBase;
����������� ����������� ����������� ����������� ����� ����� ulMatchingModuleLength =
pinhNtHdrs->OptionalHeader.SizeOfImage;
����������� ����������� ����������� ����������� ����� ����� pinhMatchingModuleNtHeaders = pinhNtHdrs;
����������� ����������� ����������� ����������� ����� ����� // Get the Name
of the Module.
����������� ����������� ����������� ����������� ����� ����� pwImageNameLengthPtr = (WORD*) ( ( (BYTE*)
pleListNodePtr ) + MACRO_IMAGENAME_FIELDOFFSET_IN_DRVSEC );
����������� ����������� ����������� ����������� ����� ����� if (
IsPagePresentAndTouch_WORD( pwImageNameLengthPtr, bTouchPages ) )
����������� ����������� ����������� ����������� ����� ����� {
����������� ����������� ����������� ����������� ����������� ����� wImageNameLength = * pwImageNameLengthPtr
/ sizeof( WORD );
����������� ����������� ����������� ����������� ����������� ����� if (
wImageNameLength != 0 &&
����������� ����������� ����������� ����������� ����������� ����� ����� wImageNameLength
<= sizeof( szImageName ) - 1 )
����������� ����������� ����������� ����������� ����������� ����� {
����������� ����������� ����������� ����������� ����������� ����� ����� pdwImageNameUnicodePtrPtr
= (DWORD*) ( ( (BYTE*) pleListNodePtr ) +
����������� ����������� ����������� ����������� ����������� ����������� ����� MACRO_IMAGENAME_FIELDOFFSET_IN_DRVSEC
+ FIELD_OFFSET( UNICODE_STRING, Buffer ) );
����������� ����������� ����������� ����������� ����� ����� ����� ����� if (
IsPagePresentAndTouch_DWORD( pdwImageNameUnicodePtrPtr, bTouchPages ) )
����������� ����������� ����������� ����������� ����������� ����� ����� {
����������� ����������� ����������� ����������� ����������� ����������� ����� pwImageNameUnicodePtr
= (WORD*) * pdwImageNameUnicodePtrPtr;
����������� ����������� ����������� ����������� ����������� ����������� ����� if ( pwImageNameUnicodePtr != NULL &&
����������� ����������� ����������� ����������� ����������� ����������� ����� ����� IsPagePresentAndTouch(
pwImageNameUnicodePtr, bTouchPages ) &&
����������� ����������� ����������� ����������� ����������� ����������� ����� ����� IsPagePresentAndTouch_WORD(
pwImageNameUnicodePtr + wImageNameLength - 1, bTouchPages ) )
����������� ����������� ����������� ����������� ����������� ����������� ����� {
����������� ����������� ����������� ����������� ����������� ����������� ����� ����� pwWordPtr = pwImageNameUnicodePtr;
����������� ����������� ����������� ����������� ����������� ����������� ����� ����� pcCharPtr = szImageName;
����������� ����������� ����������� ����� ����� ����������� ����������� ����� ����� for ( ulI = 0; ulI < wImageNameLength; ulI ++ )
����������� ����������� ����������� ����������� ����������� ����������� ����������� ����� * pcCharPtr ++ = (CHAR) ( ( * pwWordPtr ++
) & 0xFF );
����������� ����������� ����������� ����������� ����������� ����������� ����� ����� * pcCharPtr = '\0';
����������� ����������� ����������� ����������� ����������� ����������� ����� }
����������� ����������� ����������� ����������� ����������� ����� ����� }
����������� ����������� ����������� ����������� ����������� ����� }
����������� ����������� ����������� ����������� ����� ����� }
����������� ����������� ����������� ����������� ����� ����� // Exit from the
Loop.
����������� ����������� ����������� ����� ����� ����� ����� break;
����������� ����������� ����������� ����������� ����� }
����������� ����������� ����������� ����� ����� }
����������� ����������� ����������� ����� }
����������� ����������� ����� ����� }
����������� ����������� ����� }
����������� ����� ����� }
����������� ����� }
����������� ����� // Get the Pointer to the Next Node.
����������� ����� if (
IsPagePresentAndTouch_DWORD( (DWORD*) ( ( (BYTE*) pleListNodePtr ) +
FIELD_OFFSET( LIST_ENTRY, Flink ) ), bTouchPages ) == FALSE )
����������� ����� ����� break;
����������� ����� pleListNodePtr = pleListNodePtr->Flink;
����������� ����� if ( pleListNodePtr == NULL ||
����������� ����� ����� pleListNodePtr ==
(LIST_ENTRY*) pvNtoskrnlDriverSection ||
����������� ����� ����� IsPagePresentAndTouch(
pleListNodePtr, bTouchPages ) == FALSE )
����������� ����������� ����� break;
����� ����� }
����� }
����� //
Check whether there is a Match.
����� if
( pszOutputBuffer &&
����� ����� pvMatchingModuleStart && ulMatchingModuleLength
&& pinhMatchingModuleNtHeaders &&
����� ����� strlen( szImageName ) )
����� {
����� ����� IMAGE_SECTION_HEADER*�� ����� pishSectionList;
����� ����� ULONG ����������� ����������� ����� ulI;
����� ����� IMAGE_SECTION_HEADER*�� ����� pishThis;
����� ����� DWORD ����������� ����������� ����� dwStart, dwEnd, dwOffset;
����� ����� CHAR* ����������� ����������� ����� pszImageNameToBePrinted;
����� ����� BOOLEAN���������� ����������� ����� ����� bPreserveModuleFileExtension;
����� ����� if ( pdbpAddParams == NULL ||
pdbpAddParams->bPreserveModuleFileExtension == FALSE )
����������� ����� bPreserveModuleFileExtension = FALSE;
����� ����� else
����������� ����� bPreserveModuleFileExtension = TRUE;
����� ����� // Set the Pointer to the Image Name
String.
����� ����� pszImageNameToBePrinted = & szImageName[ strlen(
szImageName ) - 1 ];
����� ����� for( ; pszImageNameToBePrinted
>= szImageName; pszImageNameToBePrinted -- )
����������� ����� if ( * pszImageNameToBePrinted
== '.' &&
bPreserveModuleFileExtension == FALSE )
����������� ����� ����� *
pszImageNameToBePrinted = '\0';
����������� ����� else if
( * pszImageNameToBePrinted == '\\' ||
����������� ����� ����� *
pszImageNameToBePrinted == '/' )
����������� ����������� ����� break;
����� ����� pszImageNameToBePrinted ++;
����� ����� if ( strlen( pszImageNameToBePrinted
) )
����� ����� {
����������� ����� // Check the Sections of the Image.
����������� ����� pishSectionList = (IMAGE_SECTION_HEADER*) ( ( (BYTE*)
pinhMatchingModuleNtHeaders ) + sizeof(
IMAGE_NT_HEADERS ) );
����������� ����� if (
IsPagePresentAndTouch_BYTERANGE( (BYTE*) pishSectionList, pinhMatchingModuleNtHeaders->FileHeader.NumberOfSections
* sizeof( IMAGE_SECTION_HEADER ), bTouchPages )
)
����������� ����� {
����������� ����� ����� // Iterate through the Section List Items.
����������� ����� ����� if ( !( pdbpAddParams &&
pdbpAddParams->ulSplitInfoNoSectionStringMaxLen ) )
����������� ����� ����� {
����������� ����������� ����� for ( ulI = 0; ulI <
pinhMatchingModuleNtHeaders->FileHeader.NumberOfSections; ulI ++ )
����������� ����������� ����� {
����������� ����������� ����� ����� pishThis = & pishSectionList[ ulI ];
����������� ����������� ����� ����� if (
pishThis->SizeOfRawData == 0 )
����������� ����������� ����������� ����� continue;
����������� ����������� ����� ����� dwStart = ( (DWORD) pvMatchingModuleStart
) + pishThis->VirtualAddress;
����������� ����������� ����� ����� dwEnd = dwStart +
pishThis->SizeOfRawData - 1;
����������� ����������� ����� ����� if ( (
(DWORD) pbBytePointer ) >= dwStart &&
����������� ����������� ����������� ����� ( (DWORD) pbBytePointer ) <= dwEnd )
����������� ����������� ����� ����� {
����������� ����������� ����������� ����� dwOffset = ( (DWORD) pbBytePointer ) -
dwStart;
����������� ����������� ����������� ����� // Compose the
Required String.
����������� ����������� ����������� ����� memset( szSectionName, 0, sizeof( szSectionName ) );
����������� ����������� ����������� ����� memcpy( szSectionName, pishThis->Name,
IMAGE_SIZEOF_SHORT_NAME );
����������� ����������� ����������� ����� if (
dwOffset )
����������� ����������� ����������� ����� {
����������� ����������� ����������� ����� ����� sprintf(
pszOutputBuffer, "%s!%s+%.8X",
����������� ����������� ����������� ����������� ����� pszImageNameToBePrinted,
szSectionName, dwOffset );
����������� ����������� ����������� ����� }
����������� ����������� ����������� ����� else
����������� ����������� ����������� ����� {
����������� ����������� ����������� ����� ����� sprintf(
pszOutputBuffer, "%s!%s",
����������� ����������� ����������� ����������� ����� pszImageNameToBePrinted,
szSectionName );
����������� ����������� ����������� ����� }
����������� ����������� ����������� ����� // Return to the
Caller.
����������� ����������� ����������� ����� return;
����������� ����������� ����� ����� }
����������� ����������� ����� }
����������� ����� ����� }
����������� ����� ����� // Compose the Required String without Section Information.
����������� ����� ����� dwOffset = ( (DWORD)
pbBytePointer ) - ( (DWORD) pvMatchingModuleStart );
����������� ����� ����� if ( dwOffset &&
����������� ����������� ����� !(
pdbpAddParams && pdbpAddParams->ulSplitInfoNoSectionStringMaxLen ) )
����������� ����� ����� {
����������� ����������� ����� sprintf(
pszOutputBuffer, "%s+%.8X",
����������� ����������� ����� ����� pszImageNameToBePrinted, dwOffset );
����������� ����� ����� }
����������� ����� ����� else
����������� ����� ����� {
����������� ����������� ����� sprintf(
pszOutputBuffer, "%s",
����������� ����������� ����� ����� pszImageNameToBePrinted );
����������� ����������� ����� if ( pdbpAddParams )
����������� ����������� ����� ����� pdbpAddParams->bIsBytePointerAtTheBeginning
= TRUE;
����������� ����� ����� }
����������� ����� ����� if ( pdbpAddParams &&
pdbpAddParams->ulSplitInfoNoSectionStringMaxLen )
����������� ����� ����� {
����������� ����������� ����� pdbpAddParams->dwSplittedOffsetNoSection
= dwOffset;
����������� ����������� ����� pszOutputBuffer[
pdbpAddParams->ulSplitInfoNoSectionStringMaxLen ] = '\0';
����������� ����� ����� }
����������� ����� }
����� ����� }
����� }
����� //
Return to the Caller.
����� return;
}