📄 smsndis.cod
字号:
; 873 : else
00110 ea000003 b |$L42102|
00114 |$L42101|
; 874 : {
; 875 : memcpy(EthHdr.DestAdd, LocalMAC, 6);
00114 e59e3008 ldr r3, [lr, #8]
00118 e1de20bc ldrh r2, [lr, #0xC]
0011c e58d3018 str r3, [sp, #0x18]
00120 e1cd21bc strh r2, [sp, #0x1C]
00124 |$L42102|
; 876 : }
; 877 : memcpy(EthHdr.SrcAdd,RemoteMAC,6);
00124 e28d001e add r0, sp, #0x1E
00128 e3a02006 mov r2, #6
0012c e1a0100e mov r1, lr
00130 eb000000 bl memcpy
; 878 : EthHdr.PacketType = htons(PACKET_TYPE_IP);
00134 e3a00b02 mov r0, #2, 22
00138 |$L42455|
00138 eb000000 bl htons
; 879 : }
; 880 :
; 881 : #if 0 // to print RTP sequence num. and check it, enable this line
; 882 : {
; 883 : PBYTE pUdpHdr;
; 884 : UINT16 curSeq,destPort;
; 885 : static UINT16 basePort = 0xFFFF;
; 886 :
; 887 : if ((pPacket[0] & 0xF0) == 0x60)
; 888 : pUdpHdr = pPacket + 40;
; 889 : else
; 890 : pUdpHdr = pPacket + 20;
; 891 : destPort = (pUdpHdr[2] << 8) + pUdpHdr[3]; /* Udp DestinationPort */
; 892 : curSeq = (pUdpHdr[10] << 8) + pUdpHdr[11]; /* seq num */
; 893 :
; 894 : //DBGMSG(ZONE_WARNING, (TEXT("SmsNdis: %u %u\r\n"),destPort,curSeq));
; 895 :
; 896 : if (basePort == 0xFFFF)
; 897 : {
; 898 : // get the port that will be checked. assumption: the audio port is bigger by 2 from the video
; 899 : basePort = destPort & 0xFFFC;
; 900 : }
; 901 :
; 902 : if (destPort == basePort)
; 903 : {
; 904 : static UINT16 prevSeq = 0xFFFF;
; 905 : if (prevSeq == 0xFFFF)
; 906 : {
; 907 : DBGMSG(ZONE_WARNING, (TEXT("SmsNdis: checking vd seq port %d\r\n"),destPort));
; 908 : }
; 909 : if ((prevSeq < curSeq) && ((prevSeq+1) != curSeq))
; 910 : {
; 911 : DBGMSG(ZONE_ERROR, (TEXT("SmsNdis: miss vd t %d %d %d miss %d\r\n"),GetTickCount(),prevSeq,curSeq,curSeq-prevSeq-1));
; 912 : MessageBeep(0xFFFFFFFF);
; 913 : }
; 914 : prevSeq = curSeq;
; 915 : }
; 916 : else if (destPort == (basePort+2))
; 917 : {
; 918 : static UINT16 prevSeq = 0xFFFF;
; 919 : if (prevSeq == 0xFFFF)
; 920 : {
; 921 : DBGMSG(ZONE_WARNING, (TEXT("SmsNdis: checking au seq port %d\r\n"),destPort));
; 922 : }
; 923 : if ((prevSeq < curSeq) && ((prevSeq+1) != curSeq))
; 924 : {
; 925 : DBGMSG(ZONE_ERROR, (TEXT("SmsNdis: miss au t %d %d %d miss %d\r\n"),GetTickCount(),prevSeq,curSeq,curSeq-prevSeq-1));
; 926 : MessageBeep(0xFFFFFFFF);
; 927 : }
; 928 : prevSeq = curSeq;
; 929 : }
; 930 : }
; 931 : #endif
; 932 :
; 933 : // insert ip to ip stack
; 934 : NdisMEthIndicateReceive(pSmsNdis->hMiniportAdapter,
; 935 : NULL, // TransferData will not be called
; 936 : (PCHAR)&EthHdr, // pointer to header
; 937 : ETHERNET_HEADER_LEN, // header size
; 938 : pPacket, // pointer to buffer
; 939 : PacketLen, // lookahead buffer size
; 940 : PacketLen); // packet size
0013c e5972000 ldr r2, [r7]
00140 e1cd02b4 strh r0, [sp, #0x24]
00144 e3a0500e mov r5, #0xE
00148 e59200f8 ldr r0, [r2, #0xF8]
0014c e5924208 ldr r4, [r2, #0x208]
00150 e28d2018 add r2, sp, #0x18
00154 e28d3018 add r3, sp, #0x18
00158 e3a01000 mov r1, #0
0015c e58d800c str r8, [sp, #0xC]
00160 e58d8008 str r8, [sp, #8]
00164 e58d6004 str r6, [sp, #4]
00168 e58d5000 str r5, [sp]
0016c e1a0e00f mov lr, pc
00170 e12fff14 bx r4
; 941 :
; 942 : // update statistics counter
; 943 : pSmsNdis->RxPacketCount++;
00174 e5973060 ldr r3, [r7, #0x60]
00178 e2833001 add r3, r3, #1
0017c e5873060 str r3, [r7, #0x60]
00180 e59d0028 ldr r0, [sp, #0x28]
00184 eb000000 bl __security_check_cookie
; 944 : }
00188 e28dd02c add sp, sp, #0x2C
0018c e8bd43f0 ldmia sp!, {r4 - r9, lr}
00190 e12fff1e bx lr
00194 |$L42461|
00194 00000000 DCD |RemoteMAC|
00198 00000000 DCD |__security_cookie|
0019c |$M42457|
ENDP ; |IndicateIpPacketReceive|
EXPORT |ReadIpCB|
IMPORT |NdisIMSwitchToMiniport|
IMPORT |NdisIMRevertBack|
00000 AREA |.text| { |ReadIpCB| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 AREA |.pdata$$ReadIpCB|, PDATA, SELECTION=5, ASSOC=|.text| { |ReadIpCB| } ; comdat associative
|$T42482| DCD |$L42481|
DCD 0x40008002
; Function compile flags: /Ogsy
00000 AREA |.text| { |ReadIpCB| }, CODE, ARM, SELECTION=1 ; comdat noduplicate
00000 |ReadIpCB| PROC
; 949 : {
00000 |$L42481|
00000 e92d47f0 stmdb sp!, {r4 - r10, lr}
00004 e24dd004 sub sp, sp, #4
00008 |$M42479|
00008 e1a04002 mov r4, r2
0000c e1a06001 mov r6, r1
00010 e1a05000 mov r5, r0
; 950 : PSMS_SMS_NDIS_ST pSmsNdis = (PSMS_SMS_NDIS_ST)hContext;
; 951 : NDIS_HANDLE SwitchHandle;
; 952 : ULONG validIpCount = 0;
; 953 : ULONG u32;
; 954 : ULONG PktLen;
; 955 : PBYTE pBuff = (PBYTE)pBuffer;
; 956 :
; 957 : DBGMSG(ZONE_INFO, (TEXT("SmsNdis: +ReadIpCB 0x08%X %d\r\n"),pBuffer,BufSize));
; 958 :
; 959 : NdisIMSwitchToMiniport(pSmsNdis->hMiniportAdapter,&SwitchHandle);
00014 e5950000 ldr r0, [r5]
00018 e28d1000 add r1, sp, #0
0001c e3a09000 mov r9, #0
00020 eb000000 bl NdisIMSwitchToMiniport
; 960 :
; 961 : if (pSmsNdis->PrevPktPortionCount > 0)
00024 e5953650 ldr r3, [r5, #0x650]
00028 e3a0ae5e mov r10, #0x5E, 28
0002c e38aa00a orr r10, r10, #0xA
00030 e3530000 cmp r3, #0
00034 0a00005a beq |$L42477|
; 962 : {
; 963 : DBGMSG(ZONE_INFO, (TEXT("SmsNdis: Handle split packet. PrevPktPortionCount %d\r\n"),pSmsNdis->PrevPktPortionCount));
; 964 :
; 965 : // handle prev partial packet
; 966 : if (pSmsNdis->PrevPktPortionCount < (sizeof(UINT32) * 2))
00038 e3530008 cmp r3, #8
0003c 2a00000c bcs |$L42127|
; 967 : {
; 968 : // can't extract ip len form prev packet bytes.
; 969 : u32 = (sizeof(UINT32) * 2) - pSmsNdis->PrevPktPortionCount;
00040 e2637008 rsb r7, r3, #8
; 970 : if (u32 > BufSize)
; 971 : {
; 972 : // append to prev
; 973 : NdisMoveMappedMemory(pSmsNdis->PrevPktPortion + pSmsNdis->PrevPktPortionCount,pBuff,BufSize);
00044 e0833005 add r3, r3, r5
00048 e2830064 add r0, r3, #0x64
0004c e1570004 cmp r7, r4
00050 e1a01006 mov r1, r6
; 974 : pSmsNdis->PrevPktPortionCount += BufSize;
; 975 : NdisIMRevertBack(pSmsNdis->hMiniportAdapter,&SwitchHandle);
; 976 : return;
00054 8a000021 bhi |$L42478|
; 977 : }
; 978 : // append to prev
; 979 : NdisMoveMappedMemory(pSmsNdis->PrevPktPortion + pSmsNdis->PrevPktPortionCount,pBuff,u32);
00058 e1a02007 mov r2, r7
0005c eb000000 bl memcpy
; 980 : pSmsNdis->PrevPktPortionCount += u32;
00060 e5953650 ldr r3, [r5, #0x650]
; 981 : pBuff += u32;
00064 e0876006 add r6, r7, r6
; 982 : BufSize -= u32;
00068 e0444007 sub r4, r4, r7
0006c e0833007 add r3, r3, r7
00070 e5853650 str r3, [r5, #0x650]
00074 |$L42127|
; 983 : }
; 984 :
; 985 : if ((pSmsNdis->PrevPktPortion[0] & 0xF0) == 0x60)
00074 e5d53064 ldrb r3, [r5, #0x64]
00078 e20330f0 and r3, r3, #0xF0
0007c e3530060 cmp r3, #0x60
; 986 : {
; 987 : PktLen = ((pSmsNdis->PrevPktPortion[4] << 8) + pSmsNdis->PrevPktPortion[5]); /* PayloadLen */
; 988 : PktLen += IPV6_HEADER_LEN;
00080 05d52068 ldreqb r2, [r5, #0x68]
00084 05d53069 ldreqb r3, [r5, #0x69]
00088 00833402 addeq r3, r3, r2, lsl #8
0008c 02837028 addeq r7, r3, #0x28
00090 0a000004 beq |$L42133|
; 989 : }
; 990 : else if ((pSmsNdis->PrevPktPortion[0] & 0xF0) == 0x40)
00094 e3530040 cmp r3, #0x40
; 991 : {
; 992 : PktLen = (pSmsNdis->PrevPktPortion[2] << 8) + pSmsNdis->PrevPktPortion[3]; /* TotalLen */
00098 05d52066 ldreqb r2, [r5, #0x66]
0009c 05d53067 ldreqb r3, [r5, #0x67]
000a0 00837402 addeq r7, r3, r2, lsl #8
; 993 : }
; 994 : else
; 995 : {
; 996 : PktLen = 0;
000a4 13a07000 movne r7, #0
000a8 |$L42133|
; 997 : }
; 998 :
; 999 : u32 = PktLen - pSmsNdis->PrevPktPortionCount; // bytes needed from pBuff
000a8 e5952650 ldr r2, [r5, #0x650]
000ac e0478002 sub r8, r7, r2
; 1000 : if (PktLen > pSmsNdis->PrevPktPortionCount && PktLen < MAX_IP_FRAME_LEN && // is valid ip len
; 1001 : (pSmsNdis->PrevPktPortionCount + u32 <= MAX_IP_FRAME_LEN)) // there is enough space in buff
000b0 e1570002 cmp r7, r2
000b4 9a000018 bls |$L42134|
000b8 e157000a cmp r7, r10
000bc 2a000016 bcs |$L42134|
000c0 e0823008 add r3, r2, r8
000c4 e153000a cmp r3, r10
000c8 8a000013 bhi |$L42134|
; 1002 : {
; 1003 : if (u32 > BufSize)
; 1004 : {
; 1005 : // append to prev
; 1006 : NdisMoveMappedMemory(pSmsNdis->PrevPktPortion + pSmsNdis->PrevPktPortionCount,pBuff,BufSize);
000cc e0823005 add r3, r2, r5
000d0 e2830064 add r0, r3, #0x64
000d4 e1580004 cmp r8, r4
000d8 e1a01006 mov r1, r6
000dc 9a000005 bls |$L42135|
000e0 |$L42478|
000e0 e1a02004 mov r2, r4
000e4 eb000000 bl memcpy
; 1007 : pSmsNdis->PrevPktPortionCount += BufSize;
000e8 e5953650 ldr r3, [r5, #0x650]
; 1008 : NdisIMRevertBack(pSmsNdis->hMiniportAdapter,&SwitchHandle);
000ec e0833004 add r3, r3, r4
000f0 e5853650 str r3, [r5, #0x650]
; 1009 : return;
000f4 ea00003b b |$L42153|
000f8 |$L42135|
; 1010 : }
; 1011 : // concatenate the two portion and update pBuff pointer
; 1012 : NdisMoveMappedMemory(pSmsNdis->PrevPktPortion + pSmsNdis->PrevPktPortionCount,pBuff,u32);
000f8 e1a02008 mov r2, r8
000fc eb000000 bl memcpy
; 1013 : pBuff += u32;
; 1014 : BufSize -= u32;
; 1015 :
; 1016 : // insert ip to stack
; 1017 : IndicateIpPacketReceive(pSmsNdis,pSmsNdis->PrevPktPortion,PktLen);
00100 e1a02007 mov r2, r7
00104 e2851064 add r1, r5, #0x64
00108 e1a00005 mov r0, r5
0010c e0866008 add r6, r6, r8
00110 e0444008 sub r4, r4, r8
00114 eb000000 bl IndicateIpPacketReceive
; 1018 : validIpCount++;
00118 e3a09001 mov r9, #1
0011c |$L42134|
; 1019 : }
; 1020 : else
; 1021 : {
; 1022 : DBGMSG(ZONE_ERROR, (TEXT("SmsNdis: IP concatenation failed. %d\r\n"),PktLen));
; 1023 : }
; 1024 : pSmsNdis->PrevPktPortionCount = 0;
0011c e3a03000 mov r3, #0
00120 e5853650 str r3, [r5, #0x650]
00124 ea00001e b |$L42477|
00128 |$L42140|
; 1028 : {
; 1029 : if ((pBuff[0] & 0xF0) == 0x60)
00128 e5d63000 ldrb r3, [r6]
0012c e20330f0 and r3, r3, #0xF0
00130 e3530060 cmp r3, #0x60
; 1030 : {
; 1031 : PktLen = ((pBuff[4] << 8) + pBuff[5]); /* PayloadLen */
; 1032 : PktLen += IPV6_HEADER_LEN;
00134 05d62004 ldreqb r2, [r6, #4]
00138 05d63005 ldreqb r3, [r6, #5]
0013c 00833402 addeq r3, r3, r2, lsl #8
00140 02837028 addeq r7, r3, #0x28
00144 0a000004 beq |$L42145|
; 1033 : }
; 1034 : else if ((pBuff[0] & 0xF0) == 0x40)
00148 e3530040 cmp r3, #0x40
; 1035 : {
; 1036 : PktLen = (pBuff[2] << 8) + pBuff[3]; /* TotalLen */
0014c 05d62002 ldreqb r2, [r6, #2]
00150 05d63003 ldreqb r3, [r6, #3]
00154 00837402 addeq r7, r3, r2, lsl #8
; 1037 : }
; 1038 : else
; 1039 : {
; 1040 : PktLen = 0;
00158 13a07000 movne r7, #0
0015c |$L42145|
; 1041 : }
; 1042 :
; 1043 : if (PktLen == 0 || PktLen > MAX_IP_FRAME_LEN)
0015c e3570000 cmp r7, #0
00160 0a00000b beq |$L42147|
00164 e157000a cmp r7, r10
00168 8a000009 bhi |$L42147|
; 1052 : break;
; 1053 : }
; 1054 : DBGMSG(ZONE_ERROR, (TEXT("SmsNdis: resync %02
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -