遍历9个格子winmine!StepBlock和遍历8个格子winmine!StepBox的对决

遍历9个格子winmine!StepBlock和遍历8个格子winmine!StepBox的对决

第一部分:windbg调试记录。

0: kd> g

Breakpoint 10 hit

winmine!DoButton1Up:

001b:0100390e a130510001 mov eax,dword ptr [winmine!xCur (01005130)]

0: kd> kc

00 winmine!DoButton1Up

01 winmine!MainWndProc

02 USER32!InternalCallWinProc

03 USER32!UserCallWinProcCheckWow

04 USER32!DispatchMessageWorker

05 USER32!DispatchMessageW

06 winmine!WinMain

07 winmine!WinMainCRTStartup

08 kernel32!BaseProcessStart

0: kd> g

Breakpoint 12 hit

winmine!StepBox:

001b:010031aa 55 push ebp

1: kd> u

winmine!StepBox [d:\srv03rtm\shell\osshell\ep\winmine\rtns.c @ 254]:

010031aa 55 push ebp

010031ab 8bec mov ebp,esp

010031ad 53 push ebx

010031ae ff750c push dword ptr [ebp+0Ch]

010031b1 33db xor ebx,ebx

010031b3 ff7508 push dword ptr [ebp+8]

010031b6 43 inc ebx

010031b7 891db8570001 mov dword ptr [winmine!iStepMac (010057b8)],ebx

1: kd> pc

winmine!StepBox+0x13:

001b:010031bd e86cffffff call winmine!StepXY (0100312e)

1: kd> t

Breakpoint 15 hit

winmine!StepXY:

001b:0100312e 55 push ebp

1: kd> dv

x = 0n1

y = 0n6

cBombs = 0n6

1: kd> kc

00 winmine!StepXY

01 winmine!StepBox

02 winmine!StepBlock

03 winmine!DoButton1Up

04 winmine!MainWndProc

05 USER32!InternalCallWinProc

06 USER32!UserCallWinProcCheckWow

07 USER32!DispatchMessageWorker

08 USER32!DispatchMessageW

09 winmine!WinMain

0a winmine!WinMainCRTStartup

0b kernel32!BaseProcessStart

1: kd> g

Breakpoint 18 hit

winmine!DisplayBlk:

001b:01002744 55 push ebp

1: kd> gu

winmine!StepXY+0x4a:

001b:01003178 837d0c00 cmp dword ptr [ebp+0Ch],0

0: kd> dv

x = 0n1

y = 0n1

cBombs = 0n1

0: kd> h

^ Syntax error in 'h'

0: kd> g

Breakpoint 12 hit

winmine!StepBox:

001b:010031aa 55 push ebp

0: kd> dv

x = 0n2

y = 0n6

0: kd> kc

00 winmine!StepBox

01 winmine!StepBlock

02 winmine!DoButton1Up

03 winmine!MainWndProc

04 USER32!InternalCallWinProc

05 USER32!UserCallWinProcCheckWow

06 USER32!DispatchMessageWorker

07 USER32!DispatchMessageW

08 winmine!WinMain

09 winmine!WinMainCRTStartup

0a kernel32!BaseProcessStart

0: kd> y

^ Syntax error in 'y'

0: kd> u

winmine!StepBox [d:\srv03rtm\shell\osshell\ep\winmine\rtns.c @ 254]:

010031aa 55 push ebp

010031ab 8bec mov ebp,esp

010031ad 53 push ebx

010031ae ff750c push dword ptr [ebp+0Ch]

010031b1 33db xor ebx,ebx

010031b3 ff7508 push dword ptr [ebp+8]

010031b6 43 inc ebx

010031b7 891db8570001 mov dword ptr [winmine!iStepMac (010057b8)],ebx

0: kd> g

Breakpoint 15 hit

winmine!StepXY:

001b:0100312e 55 push ebp

0: kd> dv

x = 0n2

y = 0n6

cBombs = 0n6

0: kd> g

Breakpoint 12 hit

winmine!StepBox:

001b:010031aa 55 push ebp

0: kd> dv

x = 0n3

y = 0n6

0: kd> p

winmine!StepBox+0x4:

001b:010031ae ff750c push dword ptr [ebp+0Ch]

0: kd> p

Breakpoint 15 hit

winmine!StepXY:

001b:0100312e 55 push ebp

0: kd> dv

x = 0n3

y = 0n6

cBombs = 0n6

0: kd> g

Breakpoint 12 hit

winmine!StepBox:

001b:010031aa 55 push ebp

0: kd> dv

x = 0n1

y = 0n7

0: kd> p

winmine!StepBox+0x4:

001b:010031ae ff750c push dword ptr [ebp+0Ch]

0: kd> p

Breakpoint 15 hit

winmine!StepXY:

001b:0100312e 55 push ebp

0: kd> dv

x = 0n1

y = 0n7

cBombs = 0n7

0: kd> g

Breakpoint 18 hit

winmine!DisplayBlk:

001b:01002744 55 push ebp

0: kd> gu

winmine!StepXY+0x4a:

001b:01003178 837d0c00 cmp dword ptr [ebp+0Ch],0

0: kd> dv

x = 0n1

y = 0n0

cBombs = 0n0

0: kd> gu

winmine!StepBox+0x18:

001b:010031c2 391db8570001 cmp dword ptr [winmine!iStepMac (010057b8)],ebx

0: kd> u

winmine!StepBox+0x18 [d:\srv03rtm\shell\osshell\ep\winmine\rtns.c @ 262]:

010031c2 391db8570001 cmp dword ptr [winmine!iStepMac (010057b8)],ebx

010031c8 7470 je winmine!StepBox+0x90 (0100323a)

010031ca 56 push esi

010031cb 57 push edi

010031cc 8b349de0570001 mov esi,dword ptr winmine!rgStepY (010057e0)[ebx*4]

010031d3 8b3c9dc0510001 mov edi,dword ptr winmine!rgStepX (010051c0)[ebx*4]

010031da 4e dec esi

010031db 8d47ff lea eax,[edi-1]

0: kd> p

winmine!StepBox+0x22:

001b:010031cc 8b349de0570001 mov esi,dword ptr winmine!rgStepY (010057e0)[ebx*4]

0: kd> dv

x = 0n1

y = 0n7

0: kd> d winmine!rgStepX[1]

0: kd> dt winmine!rgStepX[1]

1\] 0n1 0: kd\> dt winmine!rgStepY\[1

1\] 0n7 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n0 y = 0n6 cBombs = 0n6 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n1 y = 0n6 cBombs = 0n6 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> fv Couldn't resolve error at 'v' 0: kd\> dv x = 0n2 y = 0n6 cBombs = 0n6 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n0 y = 0n7 cBombs = 0n7 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n2 y = 0n7 cBombs = 0n7 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n0 y = 0n8 cBombs = 0n8 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n1 y = 0n8 cBombs = 0n8 0: kd\> g Breakpoint 18 hit winmine!DisplayBlk: 001b:01002744 55 push ebp 0: kd\> dv x = 0n1 y = 0n8 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n2 y = 0n8 cBombs = 0n8 0: kd\> g Breakpoint 12 hit winmine!StepBox: 001b:010031aa 55 push ebp 0: kd\> dv x = 0n2 y = 0n7 0: kd\> kc # 00 winmine!StepBox 01 winmine!StepBlock 02 winmine!DoButton1Up 03 winmine!MainWndProc 04 USER32!InternalCallWinProc 05 USER32!UserCallWinProcCheckWow 06 USER32!DispatchMessageWorker 07 USER32!DispatchMessageW 08 winmine!WinMain 09 winmine!WinMainCRTStartup 0a kernel32!BaseProcessStart 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n2 y = 0n7 cBombs = 0n7 0: kd\> g Breakpoint 12 hit winmine!StepBox: 001b:010031aa 55 push ebp 0: kd\> dv x = 0n3 y = 0n7 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n3 y = 0n7 cBombs = 0n7 0: kd\> g Breakpoint 12 hit winmine!StepBox: 001b:010031aa 55 push ebp 0: kd\> dv x = 0n1 y = 0n8 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n1 y = 0n8 cBombs = 0n8 0: kd\> g Breakpoint 12 hit winmine!StepBox: 001b:010031aa 55 push ebp 0: kd\> dv x = 0n2 y = 0n8 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n2 y = 0n8 cBombs = 0n8 0: kd\> g Breakpoint 12 hit winmine!StepBox: 001b:010031aa 55 push ebp 0: kd\> dv x = 0n3 y = 0n8 0: kd\> g Breakpoint 15 hit winmine!StepXY: 001b:0100312e 55 push ebp 0: kd\> dv x = 0n3 y = 0n8 cBombs = 0n8 0: kd\> g Breakpoint 14 hit winmine!DrawButton: 001b:010029e2 55 push ebp 第二部分:解释和代码 ++i 返回加1后的值,碰到X1Y7cBombs等于0, 所以++iStepMac等于2 if (++iStepCur != iStepMac) 成立 所以会遍历8个格子。 其他情况iStepMac等于1,++iStepCur等于1, 直接返回了。 所以会到X1Y7的时候会遍历8个格子。 X0Y6 X1Y6 X2Y6 X0Y7 X3Y7 X0Y8 X1Y8 X2Y8 返回,继续遍历第五个格子X2Y7 /\*\*\*\*\*\* S T E P X Y \*\*\*\*\*\*/ VOID StepXY(INT x, INT y) { INT cBombs; INT iBlk = (y\<\<5) + x; BLK blk = rgBlk\[iBlk\]; if ( (blk \& MaskVisit) \|\| ((blk \&= MaskData) == iBlkMax) \|\| (blk == iBlkBombUp) ) return; cBoxVisit++; rgBlk\[iBlk\] = (CHAR) (MaskVisit \| (cBombs = CountBombs(x,y))); // // SetDIBitsToDevice(hDCCapture, // (x\<\<4)+(dxGridOff-dxBlk), (y\<\<4)+(dyGridOff-dyBlk), // dxBlk, dyBlk, 0, 0, 0, dyBlk, // lpDibBlks + rgDibOff\[cBombs\], // (LPBITMAPINFO) lpDibBlks, DIB_RGB_COLORS); // DisplayBlk(x,y); if (cBombs != 0) return; rgStepX\[iStepMac\] = x; rgStepY\[iStepMac\] = y; if (++iStepMac == iStepMax) iStepMac = 0; } /\*\*\*\*\*\* S T E P B O X \*\*\*\*\*\*/ VOID StepBox(INT x, INT y) { INT iStepCur = 0; iStepMac = 1; StepXY(x,y); if (++iStepCur != iStepMac) while (iStepCur != iStepMac) { x = rgStepX\[iStepCur\]; y = rgStepY\[iStepCur\]; StepXY(x-1, --y); StepXY(x, y); StepXY(x+1, y); StepXY(x-1, ++y); StepXY(x+1, y); StepXY(x-1, ++y); StepXY(x, y); StepXY(x+1, y); if (++iStepCur == iStepMax) iStepCur = 0; } } /\*\*\*\*\*\* S T E P B L O C K \*\*\*\*\*\*/ /\* Step in a block around a single square \*/ VOID StepBlock(INT xCenter, INT yCenter) { REGISTER INT x; REGISTER INT y; BOOL fGameOver = fFalse; if ( (!fVISIT(xCenter,yCenter)) /\* \|\| fGUESSBOMB(xCenter,yCenter) \*/ \|\| (iBLK(xCenter,yCenter) != CountMarks(xCenter,yCenter)) ) { /\* not a safe thing to do \*/ TrackMouse(-2, -2); /\* pop up the blocks \*/ return; } for(y=yCenter-1; y\<=yCenter+1; y++) for(x=xCenter-1; x\<=xCenter+1; x++) { if (!fGUESSBOMB(x,y) \&\& fISBOMB(x,y)) { fGameOver = fTrue; ChangeBlk(x, y, MaskVisit \| iBlkExplode); } else StepBox(x,y); } if (fGameOver) GameOver(fLose); else if (fCheckWin()) GameOver(fWin); } 第三部分:关键数组 0: kd\> db winmine!rgBlk 01005360 10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f ................ 01005370 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 01005380 10 0f 0f 8f 41 40 40 40-40 40 10 0f 0f 0f 0f 0f ....A@@@@@...... 01005390 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 010053a0 10 0f 8f 0f 41 41 41 41-40 40 10 0f 0f 0f 0f 0f ....AAAA@@...... 010053b0 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 010053c0 10 0f 0f 0f 41 41 8e 41-40 40 10 0f 0f 0f 0f 0f ....AA.A@@...... 010053d0 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 0: kd\> db 010053e0 10 8f 0f 8f 42 41 41 41-40 40 10 0f 0f 0f 0f 0f ....BAAA@@...... 010053f0 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 01005400 10 0f 8f 8f 43 40 40 40-40 40 10 0f 0f 0f 0f 0f ....C@@@@@...... 01005410 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 01005420 10 41 43 8e 42 40 40 40-40 40 10 0f 0f 0f 0f 0f .AC.B@@@@@...... 第六行 01005430 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 01005440 10 40 41 41 41 40 40 40-40 40 10 0f 0f 0f 0f 0f .@AAA@@@@@...... 第七行 01005450 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 0: kd\> db 01005460 10 41 41 40 41 41 41 40-40 40 10 0f 0f 0f 0f 0f .AA@AAA@@@...... 第八行 01005470 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 01005480 10 8f 41 40 41 8f 41 40-40 40 10 0f 0f 0f 0f 0f ..A@A.A@@@...... 第九行 01005490 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................ 010054a0 10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f ................ 010054b0 0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f ................