11 #define MSW_BUFSIZE 512
12 #define MAX_ARRAY_SIZE 5
15 mswBufferInit(_Inout_ PMSW_BUFFER mswBuf
,
17 _In_ DWORD bufferSize
)
19 RtlZeroMemory(mswBuf
, sizeof(*mswBuf
));
20 RtlZeroMemory(buffer
, bufferSize
);
21 mswBuf
->bytesMax
= bufferSize
;
22 mswBuf
->buffer
= buffer
;
23 mswBuf
->bufendptr
= buffer
;
28 mswBufferCheck(_Inout_ PMSW_BUFFER mswBuf
,
31 if (mswBuf
->bytesUsed
+ count
<= mswBuf
->bytesMax
)
34 mswBuf
->bufok
= FALSE
;
39 mswBufferIncUsed(_Inout_ PMSW_BUFFER mswBuf
,
42 if (!mswBufferCheck(mswBuf
, count
))
45 mswBuf
->bytesUsed
+= count
;
46 mswBuf
->bufendptr
+= count
;
51 mswBufferEndPtr(_Inout_ PMSW_BUFFER mswBuf
)
53 return mswBuf
->bufendptr
;
57 mswBufferAppend(_Inout_ PMSW_BUFFER mswBuf
,
58 _In_
void *dataToAppend
,
61 if (!mswBufferCheck(mswBuf
, dataSize
))
64 RtlCopyMemory(mswBuf
->bufendptr
, dataToAppend
, dataSize
);
65 mswBuf
->bytesUsed
+= dataSize
;
66 mswBuf
->bufendptr
+= dataSize
;
71 BOOL
mswBufferAppendStrA(_Inout_ PMSW_BUFFER mswBuf
,
74 return mswBufferAppend(mswBuf
, str
, strlen(str
) + sizeof(char));
78 mswBufferAppendStrW(_Inout_ PMSW_BUFFER mswBuf
,
81 int bytelen
= (wcslen(str
) + 1) * sizeof(WCHAR
);
82 return mswBufferAppend(mswBuf
, str
, bytelen
);
86 mswBufferAppendPtr(_Inout_ PMSW_BUFFER mswBuf
,
89 return mswBufferAppend(mswBuf
, &ptr
, sizeof(ptr
));
92 /* lst = pointer to pointer of items
97 lst[n] = NULL = End of List
99 itemLength = data in Bytes for each item.
101 ptrofs = delta relative to mswBuf.buffer
104 mswBufferAppendLst(_Inout_ PMSW_BUFFER mswBuf
,
106 _In_ DWORD itemByteLength
,
111 DWORD_PTR lstDataPos
;
113 UINT_PTR
*ptrSrcLstPos
;
115 /* calculate size of list */
116 ptrSrcLstPos
= (UINT_PTR
*)lst
;
118 while (*ptrSrcLstPos
!= (UINT_PTR
)NULL
)
124 lstByteSize
= ((lstItemCount
+ 1) * sizeof(UINT_PTR
)) + /* item-pointer + null-ptr (for end) */
125 (lstItemCount
* itemByteLength
); /* item-data */
127 if (mswBuf
->bytesUsed
+ lstByteSize
> mswBuf
->bytesMax
)
130 /* calculate position for the data of the first item */
131 lstDataPos
= ((lstItemCount
+ 1) * sizeof(UINT_PTR
)) +
132 (DWORD_PTR
)mswBufferEndPtr(mswBuf
);
134 lstDataPos
+= ptrofs
;
136 /* write array of Pointer to data */
137 for (i1
= 0; i1
< lstItemCount
; i1
++)
139 if (!mswBufferAppendPtr(mswBuf
, (void*)lstDataPos
))
142 lstDataPos
+= sizeof(UINT_PTR
);
146 if (!mswBufferAppendPtr(mswBuf
, NULL
))
150 ptrSrcLstPos
= (UINT_PTR
*)lst
;
151 for (i1
= 0; i1
< lstItemCount
; i1
++)
153 mswBufferAppend(mswBuf
, *(BYTE
**)ptrSrcLstPos
, itemByteLength
);
156 return mswBuf
->bufok
;
160 mswBufferAppendStrLstA(_Inout_ PMSW_BUFFER mswBuf
,
164 DWORD lstItemLen
[MAX_ARRAY_SIZE
];
167 DWORD_PTR lstDataPos
;
170 UINT_PTR
*ptrSrcLstPos
;
172 /* calculate size of list */
173 ptrSrcLstPos
= (UINT_PTR
*)lst
;
177 while (*ptrSrcLstPos
!= (UINT_PTR
)NULL
)
179 if (lstItemCount
>= MAX_ARRAY_SIZE
)
182 i1
= strlen((char*)*ptrSrcLstPos
) + sizeof(char);
183 lstItemLen
[lstItemCount
] = i1
;
189 lstByteSize
= ((lstItemCount
+ 1) * sizeof(UINT_PTR
)) + /* item-pointer + null-ptr (for end) */
190 lstDataSize
; /* item-data */
192 if (mswBuf
->bytesUsed
+ lstByteSize
> mswBuf
->bytesMax
)
195 /* calculate position for the data of the first item */
196 lstDataPos
= ((lstItemCount
+ 1) * sizeof(UINT_PTR
)) +
197 (DWORD_PTR
)mswBufferEndPtr(mswBuf
);
200 lstDataPos
+= ptrofs
;
202 for (i1
= 0; i1
< lstItemCount
; i1
++)
204 if (!mswBufferAppendPtr(mswBuf
, (void*)lstDataPos
))
207 lstDataPos
+= lstItemLen
[i1
];
211 if (!mswBufferAppendPtr(mswBuf
, NULL
))
215 ptrSrcLstPos
= (UINT_PTR
*)lst
;
216 for (i1
= 0; i1
< lstItemCount
; i1
++)
218 if (!mswBufferAppendStrA(mswBuf
, *(char**)ptrSrcLstPos
))
223 return mswBuf
->bufok
;
227 mswBufferAppendBlob_Hostent(_Inout_ PMSW_BUFFER mswBuf
,
228 _Inout_ LPWSAQUERYSETW lpRes
,
229 _In_
char** hostAliasesA
,
230 _In_
char* hostnameA
,
238 lpRes
->lpBlob
= (LPBLOB
)mswBufferEndPtr(mswBuf
);
240 if (!mswBufferIncUsed(mswBuf
, sizeof(*lpRes
->lpBlob
)))
243 /* cbSize will be set later */
244 lpRes
->lpBlob
->cbSize
= 0;
245 lpRes
->lpBlob
->pBlobData
= mswBufferEndPtr(mswBuf
);
248 phe
= (PHOSTENT
)lpRes
->lpBlob
->pBlobData
;
249 bytesOfs
= mswBufferEndPtr(mswBuf
);
251 if (!mswBufferIncUsed(mswBuf
, sizeof(*phe
)))
254 phe
->h_addrtype
= AF_INET
;
255 phe
->h_length
= 4; /* 4 Byte (IPv4) */
258 phe
->h_aliases
= (char**)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
262 if (!mswBufferAppendStrLstA(mswBuf
,
263 (void**)hostAliasesA
,
264 -(LONG_PTR
)bytesOfs
))
269 if (!mswBufferAppendPtr(mswBuf
, NULL
))
274 RtlZeroMemory(lst
, sizeof(lst
));
276 lst
[0] = (void*)&ip4addr
;
278 phe
->h_addr_list
= (char**)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
280 if (!mswBufferAppendLst(mswBuf
, lst
, 4, -(LONG_PTR
)bytesOfs
))
284 phe
->h_name
= (char*)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
286 if (!mswBufferAppendStrA(mswBuf
, hostnameA
))
289 lpRes
->lpBlob
->cbSize
= (DWORD
)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
290 return mswBuf
->bufok
;
294 mswBufferAppendBlob_Servent(_Inout_ PMSW_BUFFER mswBuf
,
295 _Inout_ LPWSAQUERYSETW lpRes
,
296 _In_
char* serviceNameA
,
297 _In_
char** serviceAliasesA
,
298 _In_
char* protocolNameA
,
305 lpRes
->lpBlob
= (LPBLOB
)mswBufferEndPtr(mswBuf
);
307 if (!mswBufferIncUsed(mswBuf
, sizeof(*lpRes
->lpBlob
)))
310 lpRes
->lpBlob
->cbSize
= 0;//later
311 lpRes
->lpBlob
->pBlobData
= mswBufferEndPtr(mswBuf
);
314 pse
= (LPSERVENT
)lpRes
->lpBlob
->pBlobData
;
315 bytesOfs
= mswBufferEndPtr(mswBuf
);
317 if (!mswBufferIncUsed(mswBuf
, sizeof(*pse
)))
320 pse
->s_aliases
= (char**)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
324 if (!mswBufferAppendStrLstA(mswBuf
,
325 (void**)serviceAliasesA
,
326 -(LONG_PTR
)bytesOfs
))
331 if (!mswBufferAppendPtr(mswBuf
, NULL
))
335 pse
->s_name
= (char*)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
337 if (!mswBufferAppendStrA(mswBuf
, serviceNameA
))
340 pse
->s_port
= htons(port
);
342 pse
->s_proto
= (char*)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
344 if (!mswBufferAppendStrA(mswBuf
, protocolNameA
))
347 lpRes
->lpBlob
->cbSize
= (DWORD
)(mswBufferEndPtr(mswBuf
) - bytesOfs
);
348 return mswBuf
->bufok
;
352 mswBufferAppendAddr_AddrInfoW(_Inout_ PMSW_BUFFER mswBuf
,
353 _Inout_ LPWSAQUERYSETW lpRes
,
356 LPCSADDR_INFO paddrinfo
;
359 lpRes
->dwNumberOfCsAddrs
= 1;
360 lpRes
->lpcsaBuffer
= (LPCSADDR_INFO
)mswBufferEndPtr(mswBuf
);
362 paddrinfo
= lpRes
->lpcsaBuffer
;
364 if (!mswBufferIncUsed(mswBuf
, sizeof(*paddrinfo
)))
367 paddrinfo
->LocalAddr
.lpSockaddr
= (LPSOCKADDR
)mswBufferEndPtr(mswBuf
);
369 if (!mswBufferIncUsed(mswBuf
, sizeof(*paddrinfo
->LocalAddr
.lpSockaddr
)))
372 paddrinfo
->RemoteAddr
.lpSockaddr
= (LPSOCKADDR
)mswBufferEndPtr(mswBuf
);
374 if (!mswBufferIncUsed(mswBuf
, sizeof(*paddrinfo
->RemoteAddr
.lpSockaddr
)))
377 paddrinfo
->iSocketType
= SOCK_DGRAM
;
378 paddrinfo
->iProtocol
= IPPROTO_UDP
;
380 psa
= (LPSOCKADDR_IN
)paddrinfo
->LocalAddr
.lpSockaddr
;
381 paddrinfo
->LocalAddr
.iSockaddrLength
= sizeof(*psa
);
382 psa
->sin_family
= AF_INET
;
384 psa
->sin_addr
.s_addr
= 0;
385 RtlZeroMemory(psa
->sin_zero
, sizeof(psa
->sin_zero
));
387 psa
= (LPSOCKADDR_IN
)paddrinfo
->RemoteAddr
.lpSockaddr
;
388 paddrinfo
->RemoteAddr
.iSockaddrLength
= sizeof(*psa
);
389 psa
->sin_family
= AF_INET
;
391 psa
->sin_addr
.s_addr
= ip4addr
;
392 RtlZeroMemory(psa
->sin_zero
, sizeof(psa
->sin_zero
));
397 /* ansicode <-> unicode */
399 StrA2WHeapAlloc(_In_opt_ HANDLE hHeap
,
411 charLen
= strlen(aStr
) + 1;
413 aStrByteLen
= (charLen
* sizeof(char));
414 wStrByteLen
= (charLen
* sizeof(WCHAR
));
417 hHeap
= GetProcessHeap();
419 wStr
= HeapAlloc(hHeap
, 0, wStrByteLen
);
422 HeapFree(hHeap
, 0, wStr
);
426 ret
= MultiByteToWideChar(CP_ACP
,
435 HeapFree(hHeap
, 0, wStr
);
442 StrW2AHeapAlloc(_In_opt_ HANDLE hHeap
,
453 charLen
= wcslen(wStr
) + 1;
455 aStrByteLen
= (charLen
* sizeof(char));
458 hHeap
= GetProcessHeap();
460 aStr
= HeapAlloc(hHeap
, 0, aStrByteLen
);
463 HeapFree(hHeap
, 0, aStr
);
467 ret
= WideCharToMultiByte(CP_ACP
,
475 if (ret
!= aStrByteLen
)
477 HeapFree(hHeap
, 0, aStr
);
484 StrCpyHeapAllocW(_In_opt_ HANDLE hHeap
,
495 hHeap
= GetProcessHeap();
497 chLen
= wcslen(wStr
);
499 bLen
= (chLen
+ 1) * sizeof(WCHAR
);
501 resW
= HeapAlloc(hHeap
, 0, bLen
);
502 RtlCopyMemory(resW
, wStr
, bLen
);
507 StrCpyHeapAllocA(_In_opt_ HANDLE hHeap
,
518 hHeap
= GetProcessHeap();
520 chLen
= strlen(aStr
);
522 bLen
= (chLen
+ 1) * sizeof(char);
524 resA
= HeapAlloc(hHeap
, 0, bLen
);
525 RtlCopyMemory(resA
, aStr
, bLen
);
530 StrAryCpyHeapAllocA(_In_opt_ HANDLE hHeap
,
536 DWORD aStrByteLen
[MAX_ARRAY_SIZE
];
544 hHeap
= GetProcessHeap();
546 /* Calculating size of array ... */
551 while (*aSrcPtr
!= NULL
)
553 if (aCount
>= MAX_ARRAY_SIZE
)
556 bItmLen
= strlen(*aSrcPtr
) + 1;
557 aStrByteLen
[aCount
] = bItmLen
;
559 bLen
+= sizeof(*aSrcPtr
) + bItmLen
;
565 /* size for NULL-terminator */
566 bLen
+= sizeof(*aSrcPtr
);
569 resA
= HeapAlloc(hHeap
, 0, bLen
);
575 /* pos for the first string */
576 aDstNextStr
= (char*)(resA
+ aCount
+ 1);
577 for (i1
= 0; i1
< aCount
; i1
++)
579 bItmLen
= aStrByteLen
[i1
];
581 *aDstPtr
= aDstNextStr
;
582 RtlCopyMemory(*aDstPtr
, *aSrcPtr
, bItmLen
);
584 aDstNextStr
= (char*)((DWORD_PTR
)aDstNextStr
+ (DWORD
)bItmLen
);
589 /* terminate with NULL */
596 StrAryCpyHeapAllocWToA(_In_opt_ HANDLE hHeap
,
597 _In_ WCHAR
** wStrAry
)
602 DWORD aStrByteLen
[MAX_ARRAY_SIZE
];
612 hHeap
= GetProcessHeap();
614 /* Calculating size of array ... */
619 while (*wSrcPtr
!= NULL
)
621 if (aCount
>= MAX_ARRAY_SIZE
)
624 bItmLen
= wcslen(*wSrcPtr
) + 1;
625 aStrByteLen
[aCount
] = bItmLen
;
627 bLen
+= sizeof(*wSrcPtr
) + bItmLen
;
633 /* size for NULL-terminator */
634 bLen
+= sizeof(*wSrcPtr
);
637 resA
= HeapAlloc(hHeap
, 0, bLen
);
643 /* pos for the first string */
644 aDstNextStr
= (char*)(resA
+ aCount
+ 1);
645 for (i1
= 0; i1
< aCount
; i1
++)
647 bItmLen
= aStrByteLen
[i1
];
649 *aDstPtr
= aDstNextStr
;
651 aStr
= HeapAlloc(hHeap
, 0, bItmLen
);
654 HeapFree(hHeap
, 0, aStr
);
658 ret
= WideCharToMultiByte(CP_ACP
,
668 HeapFree(hHeap
, 0, aStr
);
671 RtlCopyMemory(*aDstPtr
, aStr
, bItmLen
);
672 HeapFree(hHeap
, 0, aStr
);
674 aDstNextStr
= (char*)((DWORD_PTR
)aDstNextStr
+ (DWORD
)bItmLen
);
679 /* terminate with NULL */