Recent Posts

Pages: [1] 2 3 ... 10
1
UASM Assembler Development / Re: VARARG
« Last post by aw27 on Today at 02:13:22 AM »
I'm not sure that the x64 ABI specifically dictates this, although the general convention is to default to dwords even in 64bit mode for many things.
If using the type override is troublesome it should be possible to automatically promote the type, as the immediate is clearly too large to be a DWORD.

The default is 64-bit.
Have a look at how it is done in C/C++:

int testProc(long long arg1, ...)
{
   return 1;
}

int main()
{
   testProc(0x0123456789ABCDEF, 0x0123456789ABCDEF, 0x0123456789ABCDEF, 0x0123456789ABCDEF, 0x0123456789ABCDEF);

    return 0;
   
}

testProc(0x0123456789ABCDEF, 0x0123456789ABCDEF, 0x0123456789ABCDEF, 0x0123456789ABCDEF, 0x0123456789ABCDEF);
000000013F2B177E  mov         rax,123456789ABCDEFh 
000000013F2B1788  mov         qword ptr [rsp+20h],rax 
000000013F2B178D  mov         r9,123456789ABCDEFh 
000000013F2B1797  mov         r8,123456789ABCDEFh 
000000013F2B17A1  mov         rdx,123456789ABCDEFh 
000000013F2B17AB  mov         rcx,123456789ABCDEFh 
000000013F2B17B5  call        testProc (013F2B10F0h)
2
UASM Assembler Development / Re: VARARG
« Last post by johnsa on Today at 02:05:08 AM »
I'm not sure that the x64 ABI specifically dictates this, although the general convention is to default to dwords even in 64bit mode for many things.
If using the type override is troublesome it should be possible to automatically promote the type, as the immediate is clearly too large to be a DWORD.
3
The Campus / IOCP - 64-bit IPv6 Echo Server Stress Test
« Last post by aw27 on Today at 02:02:28 AM »
Input Output Completion Port 64-bit IPv6 Client/Server.

Launch first the Server then the Client (you can launch more than 1 Client). Each Client will launch 64 connecting threads.
This is based on the  Windows 7 SDK IOCP sample.

Server:

Code: [Select]
;\masm32\bin\ml64  -c -Zp8 iocpServer.asm
;\masm32\bin\link /ENTRY:main /SUBSYSTEM:console /MACHINE:X64 iocpServer.obj
OPTION casemap:NONE

include iocpHelper.inc
.data
heapHandle HANDLE ?
SemaphoreObject HANDLE ?

.code

ServerWorkerThread proc CompletionPortID : PTR
LOCAL CompletionPort : HANDLE
LOCAL BytesTransferred : DWORD
LOCAL PerHandleData : LPPER_HANDLE_DATA
LOCAL PerIoData : LPPER_IO_OPERATION_DATA
LOCAL SendBytes : DWORD
LOCAL RecvBytes : DWORD
LOCAL Flags : DWORD

sub rsp, 38h ; maximum 7 parameters + shadow space
and rsp, -16

mov CompletionPort, rcx

@whileLoop:
mov rcx, CompletionPort
lea rdx, BytesTransferred
lea r8, PerHandleData
lea r9, PerIoData
mov DWORD PTR [rsp+20h], INFINITE
call GetQueuedCompletionStatus
cmp eax, 0
jnz @F
errMacro err11
@@:
cmp BytesTransferred, 0
jnz @F1
mov r8, PerHandleData
mov rcx, (PER_HANDLE_DATA PTR [r8]).Socket
call closesocket
cmp eax, SOCKET_ERROR
jnz @F
errMacro err12, 1
@@:
mov rcx, heapHandle
mov edx,0
mov r8, PerHandleData
call HeapFree
mov rcx, heapHandle
mov edx,0
mov r8, PerIoData
call HeapFree
jmp @whileLoop
@F1:
mov r10, PerIoData
cmp (PER_IO_OPERATION_DATA PTR [r10]).BytesRECV,0
jnz @F
mov eax, BytesTransferred
mov (PER_IO_OPERATION_DATA PTR [r10]).BytesRECV, eax
mov (PER_IO_OPERATION_DATA PTR [r10]).BytesSEND,0
jmp @F2
@@:
mov eax, BytesTransferred
mov (PER_IO_OPERATION_DATA PTR [r10]).BytesSEND, eax
@F2:
mov eax, (PER_IO_OPERATION_DATA PTR [r10]).BytesRECV
cmp eax, (PER_IO_OPERATION_DATA PTR [r10]).BytesSEND
jbe @F3
mov r10, PerIoData
lea rdi, (PER_IO_OPERATION_DATA PTR [r10]).Overlapped
mov al, 0
mov rcx,  sizeof OVERLAPPED
cld
rep stosb
lea rax, (PER_IO_OPERATION_DATA PTR [r10]).Buffer
mov ecx, (PER_IO_OPERATION_DATA PTR [r10]).BytesSEND
add rax, rcx
mov (PER_IO_OPERATION_DATA PTR [r10]).DataBuf.buf, rax

mov ecx, (PER_IO_OPERATION_DATA PTR [r10]).BytesRECV
sub ecx, (PER_IO_OPERATION_DATA PTR [r10]).BytesSEND
mov (PER_IO_OPERATION_DATA PTR [r10]).DataBuf.len, ecx
mov r11, PerHandleData
mov rcx, (PER_HANDLE_DATA PTR [r11]).Socket
lea rdx, (PER_IO_OPERATION_DATA PTR [r10]).DataBuf
mov r8, 1
lea r9, SendBytes
mov DWORD PTR [rsp+20h], 0
lea rax, (PER_IO_OPERATION_DATA PTR [r10]).Overlapped
mov [rsp+28h], rax
mov QWORD PTR [rsp+30h],0
call WSASend
cmp eax, SOCKET_ERROR
jnz @F
call WSAGetLastError
cmp eax, ERROR_IO_PENDING
jz @F
errMacro err13, 1
@@:
jmp @whileLoop
@F3:
mov r10, PerIoData
mov (PER_IO_OPERATION_DATA PTR [r10]).BytesRECV, 0
mov Flags,0
lea rdi, (PER_IO_OPERATION_DATA PTR [r10]).Overlapped
mov al, 0
mov rcx,  sizeof OVERLAPPED
cld
rep stosb
mov (PER_IO_OPERATION_DATA PTR [r10]).DataBuf.len, DATA_BUFSIZE
lea rax, (PER_IO_OPERATION_DATA PTR [r10]).Buffer
mov (PER_IO_OPERATION_DATA PTR [r10]).DataBuf.buf, rax

mov r11, PerHandleData
mov rcx, (PER_HANDLE_DATA PTR [r11]).Socket
lea rdx, (PER_IO_OPERATION_DATA PTR [r10]).DataBuf
mov r8, 1
lea r9, RecvBytes
lea rax, Flags
mov [rsp+20h], rax
lea rax, (PER_IO_OPERATION_DATA PTR [r10]).Overlapped
mov [rsp+28h], rax
mov QWORD PTR [rsp+30h],0
call WSARecv
cmp eax, SOCKET_ERROR
jnz @F
call WSAGetLastError
cmp eax, ERROR_IO_PENDING
jz @F
errMacro err9, 1
@@:
jmp @whileLoop
@exit1:
mov rcx, 0
call ExitThread
ServerWorkerThread endp

main proc uses rdi r12
LOCAL wsadata:WSADATA
LOCAL CompletionPort : HANDLE
LOCAL SystemInfo : SYSTEM_INFO
LOCAL ThreadId : DWORD
LOCAL Listen : SOCKET
LOCAL Accept : SOCKET
LOCAL InternetAddr : SOCKADDR_IN6
LOCAL PerHandleData : LPPER_HANDLE_DATA
LOCAL PerIoData : LPPER_IO_OPERATION_DATA
LOCAL RecvBytes : DWORD
LOCAL Flags : DWORD


sub rsp, 38h ; maximum 7 parameters + shadow space
and rsp, -16

mov cx, 202h
lea rdx, wsadata
call WSAStartup
cmp eax,0
jz @F
lea rcx, err1
mov edx, eax
call printf
jmp @exit2
@@:
mov rcx, NULL
mov edx, 1
mov r8d, 1
mov r9, NULL

call CreateSemaphoreA
cmp rax, 0
jnz @F
errMacro err21
@@:
mov SemaphoreObject, rax

mov rcx, INVALID_HANDLE_VALUE
mov rdx, NULL
mov r8, 0
mov r9, 0
call CreateIoCompletionPort
cmp rax, 0
jnz @F
errMacro err2
@@:
mov CompletionPort, rax

lea rcx, SystemInfo
call GetSystemInfo

lea rax, SystemInfo
mov r12d, (SYSTEM_INFO PTR [rax]).dwNumberOfProcessors
shl r12d, 1

mov ebx, 0
@loop1start:
cmp ebx, r12d
jae @loop1exit
mov rcx,NULL
mov rdx,0
lea r8, ServerWorkerThread
mov r9, CompletionPort
mov dword ptr [rsp+20h], 0
lea rax, ThreadId
mov [rsp+28h], rax
call CreateThread
cmp rax, 0
jnz @F
errMacro err3
@@:
mov rcx, rax
call CloseHandle
inc ebx
jmp @loop1start
@loop1exit:

mov rcx, AF_INET6
mov rdx, SOCK_STREAM
mov r8, 0
mov r9, NULL
mov DWORD PTR [rsp+20h], 0
mov DWORD PTR [rsp+28h], WSA_FLAG_OVERLAPPED
call WSASocketA
cmp rax, INVALID_HANDLE_VALUE ;INVALID_SOCKET
jnz @F
errMacro err4, 1
@@:
mov Listen, rax
lea rdi, InternetAddr
mov al,0
mov rcx, sizeof InternetAddr
cld
rep stosb

mov InternetAddr.sin6_family, AF_INET6
mov cx, PORT
call htons
mov InternetAddr.sin6_port, ax
; no need to fill in6addr_any because InternetAddr.sin6_addr already filled with zeros
mov rcx, Listen
lea rdx, InternetAddr
mov r8d, sizeof InternetAddr
call bind
cmp eax, SOCKET_ERROR
jnz @F
errMacro err5, 1
@@:
mov rcx, Listen
mov edx, SOMAXCONN
call listen
cmp eax, SOCKET_ERROR
jnz @F
errMacro err6, 1
@@:
call GetProcessHeap
cmp rax, 0
jnz @F
errMacro err10
@@:
mov heapHandle, rax

@loop2start:
mov rcx, Listen
mov rdx, NULL
mov r8, NULL
mov r9, NULL
mov dword ptr [rsp+20h], 0
call WSAAccept
cmp eax, SOCKET_ERROR
jnz @F
errMacro err7, 1
@@:
mov Accept, rax
mov rcx, heapHandle
mov edx, HEAP_ZERO_MEMORY
mov r8, sizeof PER_HANDLE_DATA
call HeapAlloc
cmp rax,0
jnz @F
errMacro err8
@@:
mov PerHandleData, rax
lea rcx, msg2
mov rdx, Accept
call printf

mov r8, PerHandleData
mov rax, Accept
mov (PER_HANDLE_DATA PTR [r8]).Socket, rax

mov rcx, Accept
mov rdx, CompletionPort
mov r8, PerHandleData
mov r9,0
call CreateIoCompletionPort
cmp rax, 0
jnz @F
errMacro err2
@@:
mov rcx, heapHandle
mov edx, HEAP_ZERO_MEMORY
mov r8, sizeof PER_IO_OPERATION_DATA
call HeapAlloc

cmp rax,0
jnz @F
errMacro err8
@@:
mov PerIoData, rax

mov r10, PerIoData
lea rdi, (PER_IO_OPERATION_DATA PTR [r10]).Overlapped
mov al, 0
mov rcx,  sizeof OVERLAPPED
cld
rep stosb
mov (PER_IO_OPERATION_DATA PTR [r10]).BytesSEND,0
mov (PER_IO_OPERATION_DATA PTR [r10]).BytesRECV,0
mov (PER_IO_OPERATION_DATA PTR [r10]).DataBuf.len, DATA_BUFSIZE
lea r9, (PER_IO_OPERATION_DATA PTR [r10]).Buffer
mov (PER_IO_OPERATION_DATA PTR [r10]).DataBuf.buf, r9

mov Flags,0

mov rcx, Accept
lea rdx, (PER_IO_OPERATION_DATA PTR [r10]).DataBuf
mov r8, 1
lea r9, RecvBytes
lea rax, Flags
mov [rsp+20h], rax
lea rax, (PER_IO_OPERATION_DATA PTR [r10]).Overlapped
mov [rsp+28h], rax
mov QWORD PTR [rsp+30h],0
call WSARecv
cmp eax, SOCKET_ERROR
jnz @F
call WSAGetLastError
cmp eax, ERROR_IO_PENDING
jz @F
errMacro err9, 1
@@:
jmp @loop2start

@exit1:
mov rcx, SemaphoreObject
call CloseHandle
call WSACleanup
@exit2:
mov ecx, 0
call ExitProcess
main endp

end

Client:

Code: [Select]
;\masm32\bin\ml64  -c -Zp8 iocpClient.asm
;\masm32\bin\link /ENTRY:main /SUBSYSTEM:console /MACHINE:X64 iocpClient.obj

OPTION casemap:NONE

include iocpHelper.inc

.data
g_ThreadInfo THREADINFO <>
g_hCleanupEvent WSAEVENT ?
g_Options OPTIONS <>
heapHandle HANDLE ?
SemaphoreObject HANDLE ?

.code

SendBuffer proc uses rdi r12 nThreadNum:sdword, outbuf:PTR
LOCAL nTotalSend : SDWORD
LOCAL bufp : PTR

sub rsp, 20h
and rsp, -16

mov nThreadNum, ecx
mov outbuf, rdx
mov bufp, rdx
mov nTotalSend,0

mov r12d, g_Options.nBufSize
@loopStart:
cmp r12d, nTotalSend
jbe @loopEnd
mov ecx, nThreadNum
lea rdi, g_ThreadInfo.sd
lea rdi, [rdi+rcx*sizeof SOCKET]
mov rcx, [rdi]
mov rdx, bufp
mov r8d, g_Options.nBufSize
sub r8d, nTotalSend
mov r9d, 0
call send
cmp eax, SOCKET_ERROR
jnz @F
errMacro err19,1
@@:
cmp eax, 0
jnz @F
msgPrint msg3, nThreadNum
jmp @exit1
@@:
add nTotalSend, eax
add bufp, rax
jmp @loopStart
@loopEnd:
mov eax, 1
ret
@exit1:
mov eax, 0
ret
SendBuffer endp

RecvBuffer proc uses rdi r12 nThreadNum:sdword, inbuf:PTR
LOCAL nTotalRecv : SDWORD
LOCAL bufp : PTR

sub rsp, 20h
and rsp, -16

mov nThreadNum, ecx
mov inbuf, rdx
mov bufp, rdx
mov nTotalRecv,0

mov r12d, g_Options.nBufSize
@loopStart:
cmp r12d, nTotalRecv
jbe @loopEnd
mov ecx, nThreadNum
lea rdi, g_ThreadInfo.sd
lea rdi, [rdi+rcx*sizeof SOCKET]
mov rcx, [rdi]
mov rdx, bufp
mov r8d, g_Options.nBufSize
sub r8d, nTotalRecv
mov r9d, 0
call recv
cmp eax, SOCKET_ERROR
jnz @F
errMacro err20,1
@@:
cmp eax, 0
jnz @F
msgPrint msg3, nThreadNum
jmp @exit1
@@:
add nTotalRecv, eax
add bufp, rax
jmp @loopStart
@loopEnd:
mov eax, 1
ret
@exit1:
mov eax, 0
ret
RecvBuffer endp

EchoThread proc uses rbx rsi rdi r12 lpParameter : PTR
LOCAL inbuf : PTR
LOCAL outbuf : PTR
LOCAL nThreadNum : SDWORD

sub rsp, 20h
and rsp, -16

mov lpParameter, rcx
mov inbuf,0
mov outbuf,0
mov eax, SDWORD PTR [rcx]
mov nThreadNum, eax

msgPrint msg1, nThreadNum

mov rcx, heapHandle
mov edx, HEAP_ZERO_MEMORY
mov r8d, g_Options.nBufSize
call HeapAlloc
cmp rax,0
jnz @F
errMacro err8
@@:
mov inbuf, rax
mov rcx, heapHandle
mov edx, HEAP_ZERO_MEMORY
mov r8d, g_Options.nBufSize
call HeapAlloc
cmp rax,0
jnz @F
errMacro err8
@@:
mov outbuf, rax

mov rdi, outbuf
mov al, BYTE PTR nThreadNum
mov ecx,  g_Options.nBufSize
cld
rep stosb
@loopStart:
mov ecx, nThreadNum
mov rdx, outbuf
call SendBuffer
cmp eax, 0
je @loopEnd
mov ecx, nThreadNum
mov rdx, inbuf
call RecvBuffer
cmp eax,0
je @loopEnd
mov rsi, inbuf
mov rax, qword ptr [rsi]
mov rdi, outbuf
mov rbx, qword ptr [rdi]
cmp rax, rbx
jnz @err
mov eax, g_Options.nBufSize
sub eax, 8
add rsi, rax
add rdi, rax
mov rax, qword ptr [rsi]
mov rbx, qword ptr [rdi]
cmp rax, rbx
jnz @err
msgPrint msg4, nThreadNum
jmp @loopStart
@err:
msgPrint msg5, nThreadNum
@loopEnd:

@exit1:
cmp inbuf,0
jz @F
mov rcx, heapHandle
mov edx,0
mov r8, inbuf
call HeapFree
@@:
cmp outbuf,0
jz @F
mov rcx, heapHandle
mov edx,0
mov r8, outbuf
call HeapFree
@@:
mov rcx, 0
call ExitThread
EchoThread endp

CreateConnectedSocket proc uses rdi r12 nThreadNum : dword
LOCAL hints : addrinfo
LOCAL addr_srv : PTR addrinfo

sub rsp, 20h
and rsp, -16

mov nThreadNum, ecx

lea rdi, hints
mov al, 0
mov rcx,  sizeof addrinfo
cld
rep stosb
      mov hints.ai_flags, 0
mov hints.ai_family, AF_INET6
mov hints.ai_socktype, SOCK_STREAM
mov hints.ai_protocol, IPPROTO_TCP
lea rcx, g_Options.szHostname
lea rdx, g_Options.port
lea r8, hints
lea r9, addr_srv
call getaddrinfo
cmp eax, 0
jz @F
mov r12d, eax
msgPrint err15, r12d
jmp @exit1
@@:
mov r12, addr_srv
mov ecx, (addrinfo PTR [r12]).ai_family
mov edx, (addrinfo PTR [r12]).ai_socktype
mov r8d, (addrinfo PTR [r12]).ai_protocol
call socket
mov ecx, nThreadNum
lea rdi, g_ThreadInfo.sd
lea rdi, [rdi+rcx*sizeof SOCKET]
mov [rdi], rax
cmp rax, INVALID_SOCKET
jnz @F
errMacro err16, 1
@@:
mov rcx, [rdi]
mov rdx, (addrinfo PTR [r12]).ai_addr
mov r8, (addrinfo PTR [r12]).ai_addrlen
call connect
cmp eax, SOCKET_ERROR
jnz @F
errMacro err17, 1
@@:
mov rcx, r12
call freeaddrinfo
mov eax, 1
ret
@exit1:
mov eax, 0
ret
CreateConnectedSocket endp

main proc uses rbx rsi rdi r12
LOCAL nThreadNum[MAXTHREADS] : SDWORD
LOCAL wsadata : WSADATA
LOCAL bInitError : DWORD
LOCAL ThreadId : DWORD

sub rsp, 30h
and rsp, -16

mov ebx, 0
mov rsi, offset g_ThreadInfo.sd
mov rdi, offset g_ThreadInfo.hThread
lea r11, nThreadNum
@forLoop1Start:
cmp ebx, MAXTHREADS
jae @forLoop1End
mov rax, INVALID_SOCKET
mov [rsi], rax
mov [rdi], rax
mov DWORD PTR [r11], 0
add r11, sizeof SDWORD
add rsi, 8
add rdi, 8
inc ebx
@forLoop1End:

mov g_hCleanupEvent, WSA_INVALID_EVENT

mov cx, 202h
lea rdx, wsadata
call WSAStartup
cmp eax,0
jz @F
mov r12d, eax
msgPrint err1, r12d
jmp @exit2
@@:
call WSACreateEvent
cmp rax, WSA_INVALID_EVENT
jnz @F
errMacro err14, 1
@@:
mov g_hCleanupEvent, rax

mov rcx, NULL
mov edx, 1
mov r8d, 1
mov r9, NULL
call CreateSemaphoreA
cmp rax, 0
jnz @F
errMacro err21
@@:
mov SemaphoreObject, rax

call GetProcessHeap
cmp rax, 0
jnz @F
errMacro err10
@@:
mov heapHandle, rax

mov ebx,0
mov r12, 0
mov bInitError, 0
@forLoop2Start:
cmp ebx, g_Options.nTotalThreads

jae @forLoop2End
mov ecx, ebx
call CreateConnectedSocket
cmp eax, 1
jnz @F
lea r11, nThreadNum
add r11, r12
mov DWORD PTR [r11], ebx
mov rcx,NULL
mov rdx,0
lea r8, EchoThread
mov r9, r11
mov dword ptr [rsp+20h], 0
lea rax, ThreadId
mov [rsp+28h], rax
call CreateThread

cmp rax, NULL
jnz @F
call GetLastError
mov r12d, eax
msgPrint err18, r12d
jmp @forLoop2End
@@:
lea rdi, g_ThreadInfo.hThread
add rdi, r12
mov [rdi], rax
inc ebx
add r12, sizeof SDWORD
mov rcx, 1000
call Sleep ; let's give some time here
jmp @forLoop2Start
@forLoop2End:
mov ecx, g_Options.nTotalThreads
mov rdx, offset g_ThreadInfo.hThread
mov r8d, TRUE
mov r9d, INFINITE
call WaitForMultipleObjects
mov ecx, 1

lea rdx, g_hCleanupEvent
mov r8d, TRUE
mov r9d, WSA_INFINITE
mov DWORD PTR [rsp+20h], FALSE
call WSAWaitForMultipleEvents ; crash
mov rcx, g_hCleanupEvent
call WSACloseEvent
@exit1:
mov rcx, SemaphoreObject
call CloseHandle
call WSACleanup
@exit2:
mov ecx, 0
call ExitProcess
main endp

end

4
The Laboratory / Re: Optimizing Collatz
« Last post by johnsa on Today at 02:02:04 AM »
I believe the difference between AND and TEST is exactly that, there is a lot of avoided internal logic with TEST as the register contents is not modified and only the flags, this also has an impact on out of order execution in that the CPU is aware that the instruction won't affect the contents of the register.
5
Romper Room / Re: Cyber security tips and cyber crime consultancy
« Last post by Jokaste on Today at 01:50:35 AM »
And me I construct pc at a low price, in France only... PUB
6
Romper Room / Re: Cyber security tips and cyber crime consultancy
« Last post by hutch-- on November 20, 2017, 10:05:57 PM »
We stay away from security issues because it tends to attract the type of cockroaches that want to break security, write viruses and trojans or be involved in various forms of hacking, none of which we allow in this forum. This forum mainly caters for programmers who write assembler code so I would ask that you do not post any security technology here at all.
7
Easy Code IDE 32/64-bit / Re: Fresh Install Error
« Last post by rsala on November 20, 2017, 09:52:10 PM »
Hi,

A default form with a single button should not need the msobj140.dll' file, so please could you attach (or send to me) the project which fails? Thanks in advance.

I am a t work now, but I will try to find the problem this afternoon at home.

Regards!
8
Romper Room / Cyber security tips and cyber crime consultancy
« Last post by Cyberops on November 20, 2017, 09:19:55 PM »
Hi everyone
I am working for cyberops.in .Cyberops is India‚Äôs leading organization in the field of Information security.Advancement in technology and interconnected business ecosystems has combined to increase exposure to cyber attacks. We aim to digitally shield the cyberspace by offering various products and services. We are hovering to influence our proficiency and global footprint in the field of information security and cyber crime investigation.We foster certified trainings on Information Security and provide penetration testing for security audits, and Cyber Crime Investigation services for various sectors to meet their specific needs.Our main services are to provide best cyber security training in Jaipur ,  cyber security company in Jaipur ,secure web development and VAPT services .
Best Regards
9
UASM Assembler Development / Re: VARARG
« Last post by aw27 on November 20, 2017, 07:15:24 PM »
That is also my opinion, but the stupid x64 ABI says something else, as usual obfuscated in one cryptic phrase: The first four integer arguments are passed in registers.

Ah, I see, by integer argument appears that they are saying a 32-bit value. Really misleading.  :icon_rolleyes:
10
The Campus / Re: IPv6 structures missing?
« Last post by aw27 on November 20, 2017, 06:34:13 PM »
Or you can make your own inet_ntop from WSAAddressToString. In this case, you have to watch for a "%" in the result and remove everything after it.
Pages: [1] 2 3 ... 10