2011-04-06 15 views
7

Analiz ettiğim bir işlem için Sanal Bellek'yi eşlemek için Mark Russinovich'in VMMap'i kullanıyorum. VirtualQueryEx'i kullanarak, harici bir işlemin alanını yürütebilir ve sürecin adres alanı içindeki bellek bölgeleri hakkında bilgi alabilirim. Bu bölgeler VMMap ile eşleşir, kesinlikle, ancak VirtualQueryEx sadece belleğin işlendiği/ayrılmış/boş olduğunu ve özel/paylaşılan/resim olup olmadığını söyler.VMMap, belirli bir bellek bölgesinin özellikle Thread Stack olduğunu biliyor mu?

İşlem sanal belleğini sorgulamak için başka belgelenmiş yollar bulamıyorum. VMMap, hafızayı "Özel Veri" veya "İplik Yığını" olup olmadığını anlayabilecek şekilde sorgulamanın bir yolunu biliyor gibi görünüyor. VirtualQueryEx, her ikisini de MEM_PRIVATE olarak etiketler. Peki VMMap bu ayrımı nasıl yapıyor?

Bu ayrıntıları ayırt etmek için kullanabileceğim başka bir API işlevi var mı?

+0

http://stackoverflow.com/questions/3918375/how-to-get-thread-stack-information-on-windows – Adam

cevap

6

Mark Russinovich, sırlarını asla paylaşmaz, o da çoktur. Büyük adaylar görmemekle birlikte, belgelenmemiş iş parçacığı ortam bloğundan bulunabileceğini hayal ediyorum. Daha iyi bir potansiyel sayfa özellikleri olabilir. MEM_TOP_DOWN kullanır, sadece yığınlar buna sahiptir (VirtualAlloc'u kontrol edin). Ve StackOverflowException'ı gezen bekçi sayfasıyla birleşim, onu tamamen açıklığa kavuşturacaktı. Ben de böyle yapabildim.

+0

Anlaşmayı deneyebilirsiniz. Yazmayı bitirdiğim neredeyse özdeş bir cevabı kaldırdım. :) –

+0

Sayfa özniteliklerini bir bellek bloğunda nasıl sorgularım? –

+0

VirtualAlloc() ve arkadaşlarına bakmadı mı? VirtualQuery() kullanın. –

0

Sadece şüpheliyim ve tüm TEB'leri arıyor. ProcExp'in, verilerin çoğunu toplayan bir çekirdek modu sürücüsüne sahip olduğunu unutmayın. EPROCESS'den ThreadListHead, tüm ETHREAD/KTHREAD'leri bulmanızı sağlar ve KTHREAD, TEB'in adresine sahiptir.