MmSetAddressRangeModified用来设置PFN为dirty/modified,并将PTE的dirty位清除。但除此之外,还有个不明显的副作用,看下面的分析:
1: kd> !pte 0xfffff880`0c9e6000
VA fffff8800c9e6000
PXE @ FFFFF6FB7DBEDF88 PPE at FFFFF6FB7DBF1000 PDE at FFFFF6FB7E200320 PTE at FFFFF6FC40064F30
contains 000000003FE84863 contains 000000003FE83863 contains 0000000014516863 contains 000000000FAD7963
pfn 3fe84 ---DA--KWEV pfn 3fe83 ---DA--KWEV pfn 14516 ---DA--KWEV pfn fad7 -G-DA--KWEV
PTE entry 状态为dirty,并且是可写的(writable)。 再看调用MmSetAddressRangeModified后的状态:
1: kd> !pte 0xfffff880`0c9e6000
VA fffff8800c9e6000
PXE @ FFFFF6FB7DBEDF88 PPE at FFFFF6FB7DBF1000 PDE at FFFFF6FB7E200320 PTE at FFFFF6FC40064F30
contains 000000003FE84863 contains 000000003FE83863 contains 0000000014516863 contains 000000000FAD7921
pfn 3fe84 ---DA--KWEV pfn 3fe83 ---DA--KWEV pfn 14516 ---DA--KWEV pfn fad7 -G--A--KREV
PTE entry的dirty位已被清除,但是此pte已被设成了readonly状态了。所以如果再有写操作,必然会导致page fault发生。
这就是我曾遇到的一个Ext2Fsd的bug:Ext2Fsd为了将page cache锁定,创建了MDL并重新映射到系统空间(调用MmMapLockedPagesSpecifyCache)。新映射的va具有dirty及writable属性,故此va在spinlock (DISPATCH_LEVEL)下进行写操作不会导致任何异常。但在提交改动过程中,Ext2Fsd调用了MmSetAddressRangeModified,调用后MmSetAddressRangeModified会将此pte设置为readonly,如果下一次的写操作正好在spinlock下(DISPATCH_LEVEL),将会导致BSOD: DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1),如果在获取spinlock前曾执行过写操作(IRQL < DISPATCH_LEVEL),则会正常触发page fault,然后MmAccessFault会重置pte为writeable,并设置dirty位,此后如果再进入DISPATCH_LEVEL,对此va进行写操作便不会触发page fault了。这就构成了一定的随机性和隐蔽性,给调试带来了很大的麻烦。
明白了问题所在,不妨再做个实验:如果手工将此pte设为writeable的,再进行写操作,cpu应该直接置pte为dirty,而不必调用OS(即page fault)。
对va 0xfffffa60`04ae7000 调用MmSetAddressRangeModified后,
1: kd> !pte 0xfffffa60`04ae7000
VA fffffa6004ae7000
PXE @ FFFFF6FB7DBEDFA0 PPE at FFFFF6FB7DBF4C00 PDE at FFFFF6FB7E980128 PTE at FFFFF6FD30025738
contains 000000007FFC4863 contains 000000007FFC3863 contains 00000000539A2863 contains 00000000149AD921
pfn 7ffc4 ---DA--KWEV pfn 7ffc3 ---DA--KWEV pfn 539a2 ---DA--KWEV pfn 149ad -G--A—KREV
手工修改 0xfffffa60`04ae7000为writeable,不必置dirty标志:
1: kd> dq FFFFF6FD30025738 l1
fffff6fd`30025738 00000000`149ad921
1: kd> eb FFFFF6FD30025738 23
1: kd> !pte 0xfffffa60`04ae7000
VA fffffa6004ae7000
PXE @ FFFFF6FB7DBEDFA0 PPE at FFFFF6FB7DBF4C00 PDE at FFFFF6FB7E980128 PTE at FFFFF6FD30025738
contains 000000007FFC4863 contains 000000007FFC3863 contains 00000000539A2863 contains 00000000149AD923
pfn 7ffc4 ---DA--KWEV pfn 7ffc3 ---DA--KWEV pfn 539a2 ---DA--KWEV pfn 149ad -G--A--KWEV
在进行写操作前可以对KiPageFault或MmAccessFault设置断点,然后进行实验。看断点会不会触发,操作后再检查一下pte的dirty标志是不是已经设置了。具体实验结果,就留给读者自己去验证了。
在DISPATCH_LEVEL中操作paged va无论是已将其page锁定还是重新映射过,都有点如履薄冰的感觉,特别是对file cache,Cache Manager的不少内部操作都会更改pte的属性或调用MmSetAddressRangeModified,到处都可能有陷阱。所以最保险的方式还是不用spinlock ![]()
References:
Instant payid pokies australia https://www.thetruckersreport.com/truckingindustryforum/proxy.php?link=https://instantcasinodeutschland.de/fr-fr/
References:
Australian pokies payid http://www.fcterc.gov.ng/
References:
Payid online pokies only-good-news.ru
References:
Online pokies with payid australia real money metager.de
References:
Tipico Casino Bonus ohne Einzahlung jobteck.co.in
References:
Snatch Casino Erfahrungen https://s3.amazonaws.com/
References:
Merkur Casino Einzahlung inspiredcollectors.com
References:
Casinomilyon Bonus ohne Einzahlung s3.amazonaws.com
References:
Bet.Bet Casino Erfahrungen https://werkstraat.com/companies/instant-casino-deutschland-slots-live-casino-sport-mit-200-bonus
References:
Luck Casino App part-time.ie
References:
Bet Casino Auszahlung http://cse.google.lu/
References:
Candy96 Casino review Australia https://salestracker.realitytraining.com/node/21079
References:
Betsson Casino Bonus ohne Einzahlung https://pracaeuropa.pl/
References:
888 Casino Login https://tsnasia.com/employer/instant-casino-online-casino-mit-den-schnellsten-auszahlungen/
References:
Candy96 Casino Australia https://bestcasting.eu/
References:
Quickwin Casino Bewertung https://gmerago.com
References:
Intense Casino Bonus ohne Einzahlung cyprusjobs.com.cy
References:
Betsson Casino Auszahlung https://links.gtanet.com.br
References:
Rolletto Casino Login https://s3.amazonaws.com/new-casino/Beef-Casino-Einzahlung.html
References:
Novoline Casino Einzahlung https://recruitment.talentsmine.net
References:
Löwen Play Casino Login s3.amazonaws.com
References:
Casanova Casino Test s3.amazonaws.com
References:
Betsson Casino Bonus https://www.ukjobs.xyz/employer/instant-casino-deutschland-️-exklusiver-promo-code-und-vip-programm/
References:
Rolletto Casino Test https://s3.amazonaws.com/new-casino/Novoline-Casino-App.html
References:
Joo Casino Einzahlung http://re-file.com/cushion.php?url=http://bbs.pinggu.org/linkto.php?url=instantcasinodeutschland.de
References:
Da Vinci’s Casino Bonus http://cse.google.gg/url?sa=i&url=http://toolbarqueries.google.gy/url?q=https://instantcasinodeutschland.de/
References:
Jack Casino Test https://www.omicsonline.org/recommend-to-librarian.php?title=nrt%202%20kurdish%20tv&url=http://cse.google.com.pk/url?q=http://www.google.com.uy/url?q=https://instantcasinodeutschland.de/
References:
Lex Casino App http://captcha.2gis.ru/form?return_url=http%3A%2F%2Fvoffice.lawyers.bh%2Fsusannahglynde
References:
Malina Casino Login https://exigen.com.au/?URL=https://smartbusinesscards.in/mervincuellar
References:
Amonbet Casino Erfahrungen http://login.ezproxy.lib.uh.edu/login?qurl=https://digitally.site/eloyrieger3291
References:
Winnita Casino Erfahrungen http://www.htcdev.com/?URL=syncecard.com%2Fcarltonburks8/