| 首先表示歉意的是这个问题也许不是内核调试的问题,但我觉得其它版面也不合适,因此放在这里咨询。 我最初了解PAGE_GUARD是看windows创建线程对线程堆栈进行分配的时候,我google和msdn了下,有个 http://msdn.microsoft.com/en-us/library/aa366549(VS.85).aspx 这个示例中,先用VirtualAlloc分配了一个页面,然后连续两次VirtualLock访问,结果第一次不行,第二次就可以了。 我发现有个奇怪的事情,在VirtualAlloc后,我立即对分配的页面进行读访问,发现在VC调试的情况下不会有问题,但不调试,就会出问题;而且调试的时候后面的第一次VirtualLock有时也不会出问题了,感觉很奇怪   lpvAddr = VirtualAlloc(NULL, dwPageSize,MEM_RESERVE | MEM_COMMIT,
 PAGE_READONLY | PAGE_GUARD);
 
 ...........
  //下面这个代码是我添加的,发现调试情况下不会出问题,而且后面的第一次VirtualLock有时也不会出问题了,感觉很奇怪       DWORD * MYWORD;__asm { mov eax, lpvAddr }
 __asm { mov MYWORD, eax}
 printf("test1\n");
 DWORD aa = MYWORD[0];
 // Try to lock the committed memory. This fails the first time
 // because of the guard page.
 
 bLocked = VirtualLock(lpvAddr, dwPageSize);
 if (!bLocked) {
 fprintf(stderr, "Cannot lock at %lp, error = 0x%lx\n",
 lpvAddr, GetLastError());
 } else {
 fprintf(stderr, "Lock Achieved at %lp\n", lpvAddr);
 }
 
 bLocked = VirtualLock(lpvAddr, dwPageSize);
 if (!bLocked) {
 fprintf(stderr, "Cannot get 2nd lock at %lp, error = %lx\n",
 lpvAddr, GetLastError());
 } else {
 fprintf(stderr, "2nd Lock Achieved at %lp\n", lpvAddr);
 }
 
 
 
 |