Sagen Sie, wenn ich in meinem Prozess GetProcessHeaps
aufrufen, um eine Liste von Heaps zu erhalten, die es verwendet. Mit einem Haufen HANDLE
Wie kann ich feststellen, ob solche Heap mit der HEAP_NO_SERIALIZE
flag erstellt wurde oder nicht?Wie erkennt man, ob ein Heap serialisiert ist oder nicht?
Antwort
Während keine definitive Antwort, können Sie HeapQueryInformation(HeapCompatibilityInformation)
anrufen und wenn es 2 kehrt dann ist es serialisiert, weil MSDN dies über HEAP_NO_SERIALIZE sagt:
Die Low-Fragmentierung Heap (LFH) für einen Heap nicht aktiviert werden mit dieser Option erstellt
ich weiß nicht, ob es noch eine nicht dokumentierte API ist die Flaggen zu bekommen, aber für Debugging-Zwecke können Sie die interne Heap-Struktur direkt zugreifen:
void DumpHeapType_Win8_x86(HANDLE hHeap)
{
typedef struct {
UINT32 Unknown1[2];
UINT32 Sig;
UINT32 Unknown2[1];
void*Unknown3[2]; //LIST_ENTRY?
void*Unknown4[1+1+1+1+2];
UINT32 Unknown5[1+1+1+1];
UINT32 Flags;
} HEAP_HDR;
typedef struct {
UINT32 Unknown1[2];
UINT32 Sig;
UINT32 Unknown2[1];
void*Unknown3[2]; //LIST_ENTRY?
HEAP_HDR*pHdr;
} HEAP_THING;
HEAP_THING *pThing = (HEAP_THING*) hHeap;
if (hHeap && pThing->Sig == 0xffeeffee)
{
HEAP_HDR *pHdr = (HEAP_HDR*) pThing->pHdr;
if (pHdr->Sig == 0xffeeffee)
{
printf("Flags=%#x Serialized=%d\n", pHdr->Flags, !(pHdr->Flags & HEAP_NO_SERIALIZE));
}
}
}
void playwithheaps()
{
HANDLE hHeap;
DumpHeapType_Win8_x86(hHeap = GetProcessHeap());
DumpHeapType_Win8_x86(hHeap = HeapCreate(0, 0, 0)); if (hHeap) HeapDestroy(hHeap);
DumpHeapType_Win8_x86(hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0)); if (hHeap) HeapDestroy(hHeap);
DumpHeapType_Win8_x86(hHeap = HeapCreate(HEAP_NO_SERIALIZE|HEAP_GENERATE_EXCEPTIONS, 0, 0)); if (hHeap) HeapDestroy(hHeap);
}
Auf meinem Windows 8 Maschine das gibt mir die folgende Ausgabe:
Flags=0x2 Serialized=1
Flags=0x1002 Serialized=1
Flags=0x1003 Serialized=0
Flags=0x1007 Serialized=0
aber die Haufen Struktur Layout könnte auf andere Versionen unterschiedlich sein, so dass Sie würde nur sorgfältig prüfen müssen ...
Danke für den Versuch zu helfen, aber das ist kaum eine Lösung. Was ist, wenn der Heap nicht niedrigfragmentiert ist? – c00000fd
Hmm. Interessant. Haben Sie die Umkehrung der Heap-APIs selbst durchgeführt? – c00000fd
@ c00000fd Ich habe nicht wirklich viel von der API umgekehrt. Einige Windows-Versionen haben öffentliche Symbole für die HEAP-Struktur und den Rest können Sie wahrscheinlich herausfinden, indem Sie einfach den Handle-Speicher in DWORD-Chunks ablegen und nach Dingen suchen, die wie Zeiger und/oder Flags aussehen. – Anders
- 1. Wie erkennt man, ob ein Modell neu ist oder nicht?
- 2. Wie erkennt man, ob Mediacontroller sichtbar ist oder nicht?
- 3. Wie erkennt man, ob Bluetooth angeschlossen ist?
- 4. Wie erkennt man, ob Daydream eingeschaltet ist?
- 5. Wie erkennt man, ob ein Datei-Handle ein Socket ist?
- 6. Wie erkennt man, ob $ _POST gesetzt ist?
- 7. Wie überprüft man, ob Array ein Min-Heap ist?
- 8. Wie erkennt man, ob eine Datei PDF oder TIFF ist?
- 9. Wie erkennt man, ob AVAudioRecorder pausiert ist?
- 10. Wie erkennt man, ob ein OpenGL-Kontext Hardware-beschleunigt ist?
- 11. Wie erkennt man, ob ein Ausdruck 'Methodenaufruf' ist?
- 12. Wie erkennt man, ob ein bestimmtes Laufwerk eine Festplatte ist?
- 13. Wie erkennt man, ob JTextField leer ist?
- 14. Wie erkennt man, ob ein Typ eine benutzerdefinierte Struktur ist?
- 15. Android: Wie erkennt man, ob Benachrichtigungs-ID existiert oder nicht?
- 16. Wie erkennt man, ob ein Typ shared_ptr zur Kompilierzeit ist
- 17. Wie erkennt man, ob ein Webelement unsichtbar ist?
- 18. Wie erkennt man, ob ein Drucker mit pyqt verbunden ist?
- 19. Wie erkennt man, ob ein Tab in Chrome mit Javascript aktiviert ist oder nicht?
- 20. Wie erkennt man, ob SearchView erweitert ist?
- 21. Wie erkennt Java, ob eine Position primitiv oder referenziert ist
- 22. Qt: Wie erkennt man, ob ein Widget ausgewählt ist?
- 23. Wie erkennt man, ob ein Eingabefeldwert eine Maske ist?
- 24. Wie erkennt man, ob ein Audio zu laut ist?
- 25. Wie erkennt man, ob ein Mikrofon in Android vorhanden ist?
- 26. Wie erkennt man am besten, ob ein IDataReader leer ist?
- 27. Wie erkennt man, ob M7 vorhanden ist, a.k.a ist es ein iPhone 5S oder neuer?
- 28. Wie erkennt man, ob ein Element in einem SVN-Diff eine Datei oder ein Ordner ist?
- 29. Wie man ein Bündel serialisiert?
- 30. Wie überprüft man, ob ein div vorhanden ist oder nicht?
Wenn niemand hat eine bessere Lösung, Sie könnten die Funktionen 'HeapCreate' und' HeapDestroy' anhängen, um dies selbst zu verfolgen. –