📄 hpt370.cod
字号:
00883 56 push esi
00884 57 push edi
; 643 : while(Count-- > 0) {
00885 8b 7d 10 mov edi, DWORD PTR _Count$[ebp]
00888 8b c7 mov eax, edi
0088a 4f dec edi
0088b 85 c0 test eax, eax
0088d 76 17 jbe SHORT $L2141
0088f 8b 45 0c mov eax, DWORD PTR _SecondStr$[ebp]
00892 8b 75 08 mov esi, DWORD PTR _FirstStr$[ebp]
$L2140:
; 644 : if (*FirstStr++ != *SecondStr++)
00895 8a 10 mov dl, BYTE PTR [eax]
00897 8a 0e mov cl, BYTE PTR [esi]
00899 40 inc eax
0089a 46 inc esi
0089b 3a ca cmp cl, dl
0089d 75 0f jne SHORT $L2336
0089f 8b cf mov ecx, edi
008a1 4f dec edi
008a2 85 c9 test ecx, ecx
008a4 77 ef ja SHORT $L2140
$L2141:
008a6 5f pop edi
; 646 : }
; 647 : return 0;
008a7 33 c0 xor eax, eax
008a9 5e pop esi
; 648 : }
008aa 5d pop ebp
008ab c2 0c 00 ret 12 ; 0000000cH
$L2336:
008ae 5f pop edi
; 645 : return 1;
008af b8 01 00 00 00 mov eax, 1
008b4 5e pop esi
; 648 : }
008b5 5d pop ebp
008b6 c2 0c 00 ret 12 ; 0000000cH
_AtapiStringCmp@12 ENDP
_TEXT ENDS
PUBLIC _Hpt366Initialize@4
EXTRN _CheckArray@8:NEAR
_TEXT SEGMENT
_IdeChannel$ = 8
_dmaHpt366Mode$ = -4
_pbd$ = -8
_Hpt366Initialize@4 PROC NEAR
; 680 : {
008c0 55 push ebp
008c1 8b ec mov ebp, esp
008c3 83 ec 10 sub esp, 16 ; 00000010H
; 681 : USHORT i, j, k, l;
; 682 : static USHORT pioTiming[6] = {960, 480, 240, 180, 120, 90};
; 683 : PDevice pDev;
; 684 : USHORT dmaHpt366Mode, pioHpt366Mode, timingMode, overrideMode;
; 685 : USHORT capabilities;
; 686 : USHORT translationFieldsValid;
; 687 : USHORT enhancedPioMode;
; 688 : USHORT minPioCycleTime;
; 689 : struct _bad_disk *pbd;
; 690 : PUCHAR ptr;
; 691 :
; 692 :
; 693 : for (i = 0; i < MAX_DRIVES; i++) {
008c6 8b 45 08 mov eax, DWORD PTR _IdeChannel$[ebp]
008c9 53 push ebx
008ca 56 push esi
008cb 57 push edi
008cc c7 45 f4 00 00
00 00 mov DWORD PTR -12+[ebp], 0
008d3 8d b0 86 00 00
00 lea esi, DWORD PTR [eax+134]
008d9 c7 45 f0 02 00
00 00 mov DWORD PTR -16+[ebp], 2
$L2163:
; 694 : pDev = &IdeChannel->Devices[i];
; 695 : if (!pDev->DevicePresent)
008e0 8a 46 be mov al, BYTE PTR [esi-66]
008e3 84 c0 test al, al
008e5 0f 84 83 02 00
00 je $L2164
; 696 : continue;
; 697 :
; 698 : dmaHpt366Mode = pioHpt366Mode = 0;
008eb 33 db xor ebx, ebx
; 699 :
; 700 : for(l=0, pbd = bad_disks; pbd < &bad_disks[MAXBADDISK-1]; pbd++, l++) {
008ed c7 45 f8 00 00
00 00 mov DWORD PTR _pbd$[ebp], OFFSET FLAT:_bad_disks
008f4 89 5d fc mov DWORD PTR _dmaHpt366Mode$[ebp], ebx
008f7 bf 04 00 00 00 mov edi, OFFSET FLAT:_bad_disks+4
$L2168:
; 701 : if(AtapiStringCmp((char *)pDev->IdentifyData.ModelNumber,
; 702 : pbd->name, pbd->length) == 0) break;
008fc 8b 17 mov edx, DWORD PTR [edi]
008fe 33 c9 xor ecx, ecx
00900 8a 4f ff mov cl, BYTE PTR [edi-1]
00903 51 push ecx
00904 52 push edx
00905 56 push esi
00906 e8 00 00 00 00 call _AtapiStringCmp@12
0090b 85 c0 test eax, eax
0090d 74 7a je SHORT $L2355
; 703 : else{
; 704 : ptr=(PUCHAR)pDev->IdentifyData.ModelNumber;
; 705 :
; 706 : //if(l==3) {
; 707 : // if(ptr[3]== 'C' && ptr[4]=='D' && ptr[5]=='W' && ptr[8]=='A' &&
; 708 : // (ptr[11]=='A' || ptr[9]=='A')) break;
; 709 : //}
; 710 : //else
; 711 : //
; 712 : if(l == 4) {
0090f 66 83 fb 04 cmp bx, 4
00913 75 2b jne SHORT $L2176
; 713 : if(ptr[0]== 'a' && ptr[1]=='M' && ptr[2]=='t' && ptr[3]=='x' &&
; 714 : ptr[6]== '9' && ptr[9]=='1' && ptr[13] =='D') break;
00915 80 3e 61 cmp BYTE PTR [esi], 97 ; 00000061H
00918 75 56 jne SHORT $L2169
0091a 80 7e 01 4d cmp BYTE PTR [esi+1], 77 ; 0000004dH
0091e 75 50 jne SHORT $L2169
00920 80 7e 02 74 cmp BYTE PTR [esi+2], 116 ; 00000074H
00924 75 4a jne SHORT $L2169
00926 80 7e 03 78 cmp BYTE PTR [esi+3], 120 ; 00000078H
0092a 75 44 jne SHORT $L2169
0092c 80 7e 06 39 cmp BYTE PTR [esi+6], 57 ; 00000039H
00930 75 3e jne SHORT $L2169
00932 80 7e 09 31 cmp BYTE PTR [esi+9], 49 ; 00000031H
00936 75 38 jne SHORT $L2169
00938 80 7e 0d 44 cmp BYTE PTR [esi+13], 68 ; 00000044H
0093c 74 4b je SHORT $L2355
; 715 : }
; 716 : if(l == 6) {
0093e eb 30 jmp SHORT $L2169
$L2176:
00940 66 83 fb 06 cmp bx, 6
00944 75 2a jne SHORT $L2169
; 717 : if(ptr[16]== 'D' && ptr[17]=='C' && ptr[18]=='W' && ptr[19]=='-' &&
; 718 : ptr[20]== 'i' && ptr[21]=='r' && ptr[22] =='e') break;
00946 80 7e 10 44 cmp BYTE PTR [esi+16], 68 ; 00000044H
0094a 75 24 jne SHORT $L2169
0094c 80 7e 11 43 cmp BYTE PTR [esi+17], 67 ; 00000043H
00950 75 1e jne SHORT $L2169
00952 80 7e 12 57 cmp BYTE PTR [esi+18], 87 ; 00000057H
00956 75 18 jne SHORT $L2169
00958 80 7e 13 2d cmp BYTE PTR [esi+19], 45 ; 0000002dH
0095c 75 12 jne SHORT $L2169
0095e 80 7e 14 69 cmp BYTE PTR [esi+20], 105 ; 00000069H
00962 75 0c jne SHORT $L2169
00964 80 7e 15 72 cmp BYTE PTR [esi+21], 114 ; 00000072H
00968 75 06 jne SHORT $L2169
0096a 80 7e 16 65 cmp BYTE PTR [esi+22], 101 ; 00000065H
0096e 74 19 je SHORT $L2355
$L2169:
; 699 :
; 700 : for(l=0, pbd = bad_disks; pbd < &bad_disks[MAXBADDISK-1]; pbd++, l++) {
00970 8b 45 f8 mov eax, DWORD PTR _pbd$[ebp]
00973 83 c7 08 add edi, 8
00976 83 c0 08 add eax, 8
00979 43 inc ebx
0097a 81 ff 9c 00 00
00 cmp edi, OFFSET FLAT:_bad_disks+156
00980 89 45 f8 mov DWORD PTR _pbd$[ebp], eax
00983 0f 8c 73 ff ff
ff jl $L2168
$L2355:
; 719 : }
; 720 :
; 721 : }
; 722 : }
; 723 :
; 724 : // pDev->Vendor = l;
; 725 :
; 726 : if(*(ULONG*)pDev->IdentifyData.ModelNumber=='-1LS')
00989 81 3e 53 4c 31
2d cmp DWORD PTR [esi], 758205523 ; 2d314c53H
0098f 75 09 jne SHORT $L2180
; 727 : pDev->Flag |= PF_LS120;
00991 8b 46 b6 mov eax, DWORD PTR [esi-74]
00994 80 cc 20 or ah, 32 ; 00000020H
00997 89 46 b6 mov DWORD PTR [esi-74], eax
$L2180:
; 728 :
; 729 : capabilities = pDev->IdentifyData.Capabilities;
0099a 66 8b 46 2c mov ax, WORD PTR [esi+44]
; 730 :
; 731 : //
; 732 : // word 53
; 733 : //
; 734 : translationFieldsValid =
; 735 : *((USHORT *)&pDev->IdentifyData + 53);
0099e 66 8b 5e 34 mov bx, WORD PTR [esi+52]
; 736 :
; 737 : //
; 738 : // Are we going to use LBA mode?
; 739 : //
; 740 : if ((capabilities >> 9) & 0x1)
009a2 f6 c4 02 test ah, 2
009a5 74 04 je SHORT $L2182
; 741 : pDev->Flag |= PF_LBA;
009a7 83 4e b6 02 or DWORD PTR [esi-74], 2
$L2182:
; 742 :
; 743 : #ifdef USE_MULTIPLE
; 744 : //
; 745 : // Initially suppose the drive can use Multi-Block commands.
; 746 : // We will check it later.
; 747 : //
; 748 : if (!pDev->Atapi)
009ab 8a 4e bf mov cl, BYTE PTR [esi-65]
009ae 84 c9 test cl, cl
009b0 75 04 jne SHORT $L2183
; 749 : pDev->Flag |= PF_MULTIPLE;
009b2 83 4e b6 04 or DWORD PTR [esi-74], 4
$L2183:
; 750 : #endif // USE_MULTIPLE
; 751 :
; 752 : #ifdef _DMA_
; 753 : //
; 754 : // G E T D R I V E H I G H E S T N O R M A L D M A M O D E
; 755 : //
; 756 :
; 757 : if(pDev->Flag & PF_TAPE) {
009b6 8b 4e b6 mov ecx, DWORD PTR [esi-74]
009b9 f6 c5 02 test ch, 2
009bc 74 12 je SHORT $L2184
; 758 : pDev->Flag &= ~PF_DMA;
009be 83 e1 fe and ecx, -2 ; fffffffeH
; 759 : dmaHpt366Mode = PI_DMA_NA;
009c1 c7 45 fc 00 00
00 00 mov DWORD PTR _dmaHpt366Mode$[ebp], 0
009c8 89 4e b6 mov DWORD PTR [esi-74], ecx
; 760 : goto pio;
009cb e9 e4 00 00 00 jmp $pio$2185
$L2184:
; 761 : }
; 762 :
; 763 : if (capabilities & 0x100) {
009d0 f6 c4 01 test ah, 1
009d3 74 34 je SHORT $chk_ultra$2189
; 764 : USHORT multiWordDmaMode;
; 765 :
; 766 : if(pbd->DMAMode == 0xff)
009d5 8b 45 f8 mov eax, DWORD PTR _pbd$[ebp]
009d8 8a 50 01 mov dl, BYTE PTR [eax+1]
009db 80 fa ff cmp dl, 255 ; 000000ffH
009de 74 29 je SHORT $chk_ultra$2189
; 767 : goto chk_ultra;
; 768 : //
; 769 : // Check single_word DMA / multi_word DMA supporting.
; 770 : // We use DMA on the drive only when it supports Single-Word
; 771 : // DMA Mode 2 or Multi-Word DMA mode 1 or Multi-Word DMA Mode
; 772 : // 2. Otherwise we use PIO.
; 773 : //
; 774 : multiWordDmaMode = *((USHORT *)&pDev->IdentifyData + 63);
009e0 66 8b 46 48 mov ax, WORD PTR [esi+72]
; 775 :
; 776 : if (multiWordDmaMode & 6) {
009e4 a8 06 test al, 6
009e6 74 21 je SHORT $chk_ultra$2189
; 777 : //
; 778 : // Support Multi-Word DMA.
; 779 : //
; 780 : dmaHpt366Mode = (multiWordDmaMode&0x4)? 2 : 1;
009e8 24 04 and al, 4
009ea f6 d8 neg al
009ec 1b c0 sbb eax, eax
009ee f7 d8 neg eax
009f0 40 inc eax
009f1 8b d8 mov ebx, eax
; 781 :
; 782 : if(dmaHpt366Mode > pbd->DMAMode)
009f3 66 33 c0 xor ax, ax
009f6 8a c2 mov al, dl
009f8 89 5d fc mov DWORD PTR _dmaHpt366Mode$[ebp], ebx
009fb 66 3b d8 cmp bx, ax
009fe 76 03 jbe SHORT $L2192
; 783 : dmaHpt366Mode = pbd->DMAMode;
00a00 89 45 fc mov DWORD PTR _dmaHpt366Mode$[ebp], eax
$L2192:
; 784 : pDev->Flag |= PF_DMA;
00a03 83 c9 01 or ecx, 1
00a06 89 4e b6 mov DWORD PTR [esi-74], ecx
$chk_ultra$2189:
; 785 : }
; 786 : }
; 787 :
; 788 :
; 789 : //
; 790 : // G E T D R I V E H I G H E S T U L T R A D M A M O D E
; 791 : //
; 792 : chk_ultra:
; 793 : if (translationFieldsValid&0x4) {
00a09 66 8b 5e 34 mov bx, WORD PTR [esi+52]
00a0d f6 c3 04 test bl, 4
00a10 0f 84 9e 00 00
00 je $pio$2185
; 794 : USHORT word88;
; 795 : if(pbd->UltraDMAMode == 0xff) {
00a16 8b 4d f8 mov ecx, DWORD PTR _pbd$[ebp]
00a19 80 39 ff cmp BYTE PTR [ecx], 255 ; 000000ffH
00a1c 75 14 jne SHORT $L2195
; 796 : pDev->Flag &= ~PF_DMA;
00a1e 8b 46 b6 mov eax, DWORD PTR [esi-74]
; 797 : dmaHpt366Mode = PI_DMA_NA;
00a21 c7 45 fc 00 00
00 00 mov DWORD PTR _dmaHpt366Mode$[ebp], 0
00a28 24 fe and al, -2 ; fffffffeH
00a2a 89 46 b6 mov DWORD PTR [esi-74], eax
; 798 : goto pio;
00a2d e9 82 00 00 00 jmp $pio$2185
$L2195:
; 799 : }
; 800 :
; 801 : word88 = *((USHORT *)&pDev->IdentifyData + 88);
00a32 66 8b 46 7a mov ax, WORD PTR [esi+122]
; 802 :
; 803 : if (word88) {
00a36 66 85 c0 test ax, ax
00a39 74 79 je SHORT $pio$2185
; 804 : pDev->UltraDmaMode =
; 805 : (word88 & 0x20)? 5 :
; 806 : (word88 & 0x8)? 4 :
; 807 : (word88 & 0x10 ) ? 3:
; 808 : (word88 & 0x4) ? 2 : //ultra DMA Mode 2
; 809 : (word88 & 0x2) ? 1 : 0; //ultra DMA Mode 1
00a3b a8 20 test al, 32 ; 00000020H
00a3d 74 07 je SHORT $L2344
00a3f b8 05 00 00 00 mov eax, 5
00a44 eb 26 jmp SHORT $L2339
$L2344:
00a46 a8 08 test al, 8
00a48 74 07 je SHORT $L2342
00a4a b8 04 00 00 00 mov eax, 4
00a4f eb 1b jmp SHORT $L2339
$L2342:
00a51 a8 10 test al, 16 ; 00000010H
00a53 74 07 je SHORT $L2340
00a55 b8 03 00 00 00 mov eax, 3
00a5a eb 10 jmp SHORT $L2339
$L2340:
00a5c a8 04 test al, 4
00a5e 74 07 je SHORT $L2338
00a60 b8 02 00 00 00 mov eax, 2
00a65 eb 05 jmp SHORT $L2339
$
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -