Author | Message | Time |
---|---|---|
BreW | For some reason, connect returns -1, and both GetLastError and WSAGetLastError return 10014, which according to msdn is: [quote] WSAEFAULT 10014 The system detected an invalid pointer address in attempting to use a pointer argument in a call. [/quote] but i can't see what i'm doing wrong at all. Here's my connect function: [code] SOCKET s; bool ConnectSocket(const char *server, unsigned short port) { WSADATA asdf; struct sockaddr_in sdfsds; //190h - WSAData struct //1A0h - sockaddr_in struct _asm { lea eax, [ebp - 01A0h] push 1A0h push 0 push eax call memset add esp, 0Ch cmp connected, 0 je _isnotconnected // call DisconnectSocket _isnotconnected: lea ecx, [ebp - 0190h] push ecx push 0101h call dword ptr [WSAStartup] cmp eax, 0 jne _error lea ecx, [ebp - 190h] cmp word ptr [ecx], 0101h jne _error push IPPROTO_TCP push SOCK_STREAM push AF_INET call dword ptr [socket] mov s, eax cmp eax, 0FFFFFFFFh je _error mov word ptr [ebp - 1A0h], AF_INET push port call dword ptr [htons] mov word ptr [ebp - 19Eh], ax push server call dword ptr [inet_addr] add esp, 4 mov dword ptr [ebp - 19Ch], eax lea eax, [ebp - 1A0h] push 10h push eax push s call dword ptr [connect] cmp eax, 0FFFFFFFFh //call dword ptr [GetLastError] < ------ returns 10014 je _error mov eax, 1 jmp _done _error: call dword ptr [WSACleanup] xor eax, eax _done: mov esp, ebp pop ebp ret 8 } } [/code] | November 21, 2007, 12:10 AM |
UserLoser | did you call WSAStartup? | November 23, 2007, 8:58 AM |
BreW | [quote author=UserLoser link=topic=17184.msg174982#msg174982 date=1195808297] did you call WSAStartup? [/quote] Yes. [quote] lea ecx, [ebp - 0190h] // loads base address of the WSADATA struct into ecx push ecx //2nd parameter, LPWSADATA. push 0101h //1st parameter, Requested version. Winsock 1.1 is requested here call dword ptr [WSAStartup] //calls the API cmp eax, 0 //if WSAStartup was unsuccessful, it returns a nonzero value. jne _error //jump if flag was set. [/quote] Also, if i had failed to call WSAStartup first, wouldn't I be getting WSANOTINITIALISED (10093)? | November 23, 2007, 2:42 PM |
UserLoser | why don't you do it the way you're supposed to do it instead of wasting time and confusing with inline assembly? | November 23, 2007, 8:06 PM |
warz | or, at least code entirely in assembly. you get negative cool points for trying to look cool, but failing. | November 23, 2007, 9:16 PM |
BreW | [quote author=UserLoser link=topic=17184.msg174985#msg174985 date=1195848391] why don't you do it the way you're supposed to do it instead of wasting time and confusing with inline assembly? [/quote] Because msvc6 calls some function to check esp's value after every api call. It's really annoying. And i gain much more experience doing it this way, also it's more fun imo. I've found an error, not really THE error though (add esp, 4 after the call to inet_addr, i probably got rid of a call to another function but forgot about that), and the same thing written in C fails as well. | November 23, 2007, 9:24 PM |
BreW | Arrg, bs. I rewrote the entire function in C as close as i can, and it worked. Great, right? No. Here's the disassembly from MSVC6's debugger: [code] 183: WSAStartup(0x0101, &asdf); 00401212 8B F4 mov esi,esp 00401214 8D 85 70 FE FF FF lea eax,[ebp-190h] 0040121A 50 push eax 0040121B 68 01 01 00 00 push 101h 00401220 FF 15 C0 B2 41 00 call dword ptr [__imp__WSAStartup@8 (0041b2c0)] 00401226 3B F4 cmp esi,esp 00401228 E8 D1 02 00 00 call _chkesp (004014fe) 184: if (asdf.wVersion != 0x0101) goto blah_; 0040122D 0F B7 85 70 FE FF FF movzx eax,word ptr [ebp-190h] 00401234 3D 01 01 00 00 cmp eax,101h 00401239 74 05 je ConnectSocket+62h (00401240) 0040123B E9 A3 00 00 00 jmp done_+0Ah (004012e3) 185: s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 00401240 8B F4 mov esi,esp 00401242 6A 06 push 6 00401244 6A 01 push 1 00401246 6A 02 push 2 00401248 FF 15 BC B2 41 00 call dword ptr [__imp__socket@12 (0041b2bc)] 0040124E 3B F4 cmp esi,esp 00401250 E8 A9 02 00 00 call _chkesp (004014fe) 00401255 A3 28 46 41 00 mov [s (00414628)],eax 186: if (s == INVALID_SOCKET) goto blah_; 0040125A 83 3D 28 46 41 00 FF cmp dword ptr [s (00414628)],0FFh 00401261 75 02 jne ConnectSocket+87h (00401265) 00401263 EB 7C jmp done_+8 (004012e1) 187: sckaddr.sin_family = AF_INET; 00401265 66 C7 85 60 FE FF FF mov word ptr [ebp-1A0h],offset ConnectSocket+8Eh (0040126c) 188: sckaddr.sin_port = htons(port); 0040126E 8B F4 mov esi,esp 00401270 FF 75 0C push dword ptr [ebp+0Ch] 00401273 FF 15 B8 B2 41 00 call dword ptr [__imp__htons@4 (0041b2b8)] 00401279 3B F4 cmp esi,esp 0040127B E8 7E 02 00 00 call _chkesp (004014fe) 00401280 66 89 85 62 FE FF FF mov word ptr [ebp-19Eh],ax 189: sckaddr.sin_addr.S_un.S_addr = inet_addr(server); 00401287 8B F4 mov esi,esp 00401289 FF 75 08 push dword ptr [ebp+8] 0040128C FF 15 B4 B2 41 00 call dword ptr [__imp__inet_addr@4 (0041b2b4)] 00401292 3B F4 cmp esi,esp 00401294 E8 65 02 00 00 call _chkesp (004014fe) 00401299 89 85 64 FE FF FF mov dword ptr [ebp-19Ch],eax 190: if (connect(s, (const struct sockaddr *)&sckaddr, sizeof(struct sockaddr_in)) == INVALID_SOCKET) goto blah_; 0040129F 8B F4 mov esi,esp 004012A1 6A 10 push 10h 004012A3 8D 85 60 FE FF FF lea eax,[ebp-1A0h] 004012A9 50 push eax 004012AA FF 35 28 46 41 00 push dword ptr [s (00414628)] 004012B0 FF 15 B0 B2 41 00 call dword ptr [__imp__connect@12 (0041b2b0)] 004012B6 3B F4 cmp esi,esp 004012B8 E8 41 02 00 00 call _chkesp (004014fe) 004012BD 83 F8 FF cmp eax,0FFh 004012C0 75 02 jne ConnectSocket+0E6h (004012c4) 004012C2 EB 1B jmp done_+6 (004012df) 191: goto done_; 004012C4 EB 17 jmp done_+4 (004012dd) 192: blah_: 193: WSACleanup(); 004012C6 8B F4 mov esi,esp 004012C8 FF 15 AC B2 41 00 call dword ptr [__imp__WSACleanup@0 (0041b2ac)] 004012CE 3B F4 cmp esi,esp 004012D0 E8 29 02 00 00 call _chkesp (004014fe) 194: return false; 004012D5 32 C0 xor al,al 004012D7 EB 0C jmp done_+0Ch (004012e5) 195: done_: 196: return true; 004012D9 B0 01 mov al,1 004012DB EB 08 jmp done_+0Ch (004012e5) 197: } [/code] which, if you look at the original code that I wrote, is almost EXACTLY the same with the exception of the esp checking, and a few quirks (note the last two lines, they modify the low bit alone for some reason. I find that kind of odd, is this an optimization?) What is it doing so different that it's working! I can't find it. | November 24, 2007, 1:03 AM |
Maddox | Try making your function naked and specify a calling convention. | December 10, 2007, 9:37 PM |