760{
762 ULONG ReturnedLength;
765 CHAR SystemRoot[MAX_PATH] = {0};
766 CHAR ModuleSymbolPath[MAX_PATH] = {0};
767 CHAR TempPath[MAX_PATH] = {0};
771 UINT32 ModuleDetailsSize = 0;
776
777
778
779
781
782
783
784
785 if (GetSystemDirectoryA(SystemRoot, MAX_PATH) == NULL)
786 {
787 ShowMessages("err, unable to get system directory (%x)\n",
788 GetLastError());
789
791 }
792
793 string SystemRootString(SystemRoot);
794
795
796
797
798 transform(SystemRootString.begin(),
799 SystemRootString.end(),
800 SystemRootString.begin(),
801 [](
UCHAR c) { return std::tolower(c); });
802
803
804
805
806 Replace(SystemRootString,
"\\system32",
"");
807
808
809
810
811
812
814 {
815 ShowMessages("err, unable to get module information\n");
817 }
818
819
820
821
822
823
824
825
826
827
828
829 do
830 {
831
832
833
835 {
836 break;
837 }
838
839
840
841
842 ModuleCountRequest.
ProcessId = UserProcessId;
844
845
846
847
848 Status = DeviceIoControl(
851
852 &ModuleCountRequest,
854 &ModuleCountRequest,
856
857 &ReturnedLength,
858 NULL
859 );
860
861 if (!Status)
862 {
863 break;
864 }
865
866
867
868
870 {
872
873
874
877
879
880 if (ModuleDetailsRequest == NULL)
881 {
882 break;
883 }
884
885 RtlZeroMemory(ModuleDetailsRequest, ModuleDetailsSize);
886
887
888
889
890 ModuleDetailsRequest->
ProcessId = UserProcessId;
892
893
894
895
896 Status = DeviceIoControl(
899
900 ModuleDetailsRequest,
902 ModuleDetailsRequest,
903 ModuleDetailsSize,
904
905 &ReturnedLength,
906 NULL
907 );
908
909 if (!Status)
910 {
911 free(ModuleDetailsRequest);
912 break;
913 }
914
915
916
917
919 {
920
921
922
925
926
927
928
929 if (Modules == NULL)
930 {
931 ModulesCount = 0;
932 free(ModuleDetailsRequest);
933 break;
934 }
935 }
936 else
937 {
939 free(ModuleDetailsRequest);
940 break;
941 }
942
943
944
945
946 IsFreeUsermodeModulesBuffer =
TRUE;
947 }
948 else
949 {
951 break;
952 }
953
955
956
957
958
959
960
961
962
965
966 if (ModuleSymDetailArray == NULL)
967 {
968 ShowMessages("err, unable to allocate memory for module list (%x)\n",
969 GetLastError());
970
971 if (IsFreeUsermodeModulesBuffer)
972 {
973 free(ModuleDetailsRequest);
974 }
975
976 free(ModuleInfo);
978 }
979
980
981
982
984
985
986
987
988
989
990
991 if (ModulesCount != 0)
992 {
993 for (
UINT32 i = 0; i < ModulesCount; i++)
994 {
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009 RtlZeroMemory(ModuleSymbolPath, sizeof(ModuleSymbolPath));
1010 RtlZeroMemory(TempPath, sizeof(TempPath));
1011 RtlZeroMemory(ModuleSymbolGuidAndAge, sizeof(ModuleSymbolGuidAndAge));
1012 std::vector<BYTE> LoadedImageBytes;
1013
1014
1015
1016
1017 wcstombs(TempPath, Modules[i].FilePath, MAX_PATH);
1018
1019 if (SendOverSerial && Modules[i].BaseAddress != 0 &&
1020 SymbolReadLoadedUserModuleForCodeView(Modules[i].BaseAddress, UserProcessId, LoadedImageBytes) &&
1022 LoadedImageBytes.size(),
1023 TempPath,
1024 ModuleSymbolPath,
1025 ModuleSymbolGuidAndAge,
1026 ModuleDetailsRequest->
Is32Bit))
1027 {
1028 IsSymbolPdbDetailAvailable =
TRUE;
1029
1030
1031 }
1033 TempPath,
1034 ModuleSymbolPath,
1035 ModuleSymbolGuidAndAge,
1036 ModuleDetailsRequest->
Is32Bit))
1037 {
1038 IsSymbolPdbDetailAvailable =
TRUE;
1039
1040
1041 }
1042 else
1043 {
1044 IsSymbolPdbDetailAvailable =
FALSE;
1045
1046
1047 }
1048
1049
1050
1051
1055
1056 memcpy(ModuleSymDetailArray[i].FilePath, TempPath, strlen(TempPath));
1057
1058 if (IsSymbolPdbDetailAvailable)
1059 {
1062 memcpy(ModuleSymDetailArray[i].ModuleSymbolPath, ModuleSymbolPath, MAX_PATH);
1063
1064
1065
1066
1067 string ModuleSymbolPathString(ModuleSymbolPath);
1068 if (ModuleSymbolPathString.find(":\\") != std::string::npos)
1070 else
1072 }
1073 else
1074 {
1076 }
1077
1078
1079
1080
1081
1082
1083 if (SendOverSerial)
1084 {
1086 }
1087 }
1088 }
1089
1090
1091
1092
1093
1094
1095
1097 {
1098 UINT32 IndexInSymbolBuffer = ModulesCount + i;
1099
1100 auto PathName = ModuleInfo->Modules[i].FullPathName + ModuleInfo->Modules[i].OffsetToFileName;
1101
1102
1103
1104
1105 RtlZeroMemory(ModuleSymbolPath, sizeof(ModuleSymbolPath));
1106 RtlZeroMemory(ModuleSymbolGuidAndAge, sizeof(ModuleSymbolGuidAndAge));
1107
1108 string ModuleFullPath((
const CHAR *)ModuleInfo->Modules[i].FullPathName);
1109
1110 if (ModuleFullPath.rfind("\\SystemRoot\\", 0) == 0)
1111 {
1112
1113
1114
1115
1116
1117 Replace(ModuleFullPath,
"\\SystemRoot", SystemRootString);
1118 }
1119
1120
1121
1122
1124 ModuleSymbolPath,
1125 ModuleSymbolGuidAndAge,
1127 {
1128 IsSymbolPdbDetailAvailable =
TRUE;
1129
1130
1131
1132
1133 }
1134 else
1135 {
1136 IsSymbolPdbDetailAvailable =
FALSE;
1137
1138
1139
1140
1141 }
1142
1143
1144
1145
1146 ModuleSymDetailArray[IndexInSymbolBuffer].
BaseAddress = (UINT64)ModuleInfo->Modules[i].ImageBase;
1147 memcpy(ModuleSymDetailArray[IndexInSymbolBuffer].FilePath, ModuleFullPath.c_str(), ModuleFullPath.size());
1148
1149 if (IsSymbolPdbDetailAvailable)
1150 {
1152 memcpy(ModuleSymDetailArray[IndexInSymbolBuffer].ModuleSymbolGuidAndAge, ModuleSymbolGuidAndAge,
MAXIMUM_GUID_AND_AGE_SIZE);
1153 memcpy(ModuleSymDetailArray[IndexInSymbolBuffer].ModuleSymbolPath, ModuleSymbolPath, MAX_PATH);
1154
1155
1156
1157
1158 string ModuleSymbolPathString(ModuleSymbolPath);
1159 if (ModuleSymbolPathString.find(":\\") != std::string::npos)
1161 else
1163 }
1164 else
1165 {
1167 }
1168
1169
1170
1171
1172
1173
1174 if (SendOverSerial)
1175 {
1177 }
1178 }
1179
1180
1181
1182
1183
1184
1185
1186
1187 *BufferToStoreDetails = ModuleSymDetailArray;
1189
1190 free(ModuleInfo);
1191
1192 if (IsFreeUsermodeModulesBuffer)
1193 {
1194 free(ModuleDetailsRequest);
1195 }
1196
1198}
struct _RTL_PROCESS_MODULES * PRTL_PROCESS_MODULES
BOOLEAN ShowErrorMessage(UINT32 Error)
shows the error message
Definition debugger.cpp:40
VOID KdSendSymbolDetailPacket(PMODULE_SYMBOL_DETAIL SymbolDetailPacket, UINT32 CurrentSymbolInfoIndex, UINT32 TotalSymbols)
Send each packet of debugging information (PDB) to the debugger.
Definition kd.cpp:3424
HANDLE g_DeviceHandle
Holds the global handle of device which is used to send the request to the kernel by IOCTL,...
Definition globals.h:481
NULL()
Definition test-case-generator.py:530
BOOLEAN ScriptEngineConvertFileToPdbFileAndGuidAndAgeDetailsWrapper(const CHAR *LocalFilePath, CHAR *PdbFilePath, CHAR *GuidAndAgeDetails, BOOLEAN Is32BitModule)
ScriptEngineConvertFileToPdbFileAndGuidAndAgeDetails wrapper.
Definition script-engine-wrapper.cpp:246
BOOLEAN ScriptEngineConvertLoadedModuleToPdbFileAndGuidAndAgeDetailsWrapper(const BYTE *LoadedImageBytes, SIZE_T LoadedImageSize, const CHAR *LocalFilePath, CHAR *PdbFilePath, CHAR *GuidAndAgeDetails, BOOLEAN Is32BitModule)
ScriptEngineConvertLoadedModuleToPdbFileAndGuidAndAgeDetails wrapper.
Definition script-engine-wrapper.cpp:268
BOOLEAN IsUserMode
Definition Symbols.h:29
BOOLEAN Is32Bit
Definition Symbols.h:30
UINT64 BaseAddress
Definition Symbols.h:31
BOOLEAN IsLocalSymbolPath
Definition Symbols.h:26
BOOLEAN IsSymbolDetailsFound
Definition Symbols.h:25
ULONG NumberOfModules
Definition Windows.h:34
UINT32 Result
Definition Symbols.h:52
UINT32 ModulesCount
Definition Symbols.h:51
UINT32 ProcessId
Definition Symbols.h:48
BOOLEAN Is32Bit
Definition Symbols.h:50
BOOLEAN OnlyCountModules
Definition Symbols.h:49
UINT64 BaseAddress
Definition Symbols.h:40
BOOLEAN SymbolCheckAndAllocateModuleInformation(PRTL_PROCESS_MODULES *Modules)
Check and allocate module information.
Definition symbol.cpp:1303
BOOLEAN SymbolDeleteSymTable()
Delete and free structures and variables related to the symbols.
Definition symbol.cpp:717