PHELPER_DATA HelperData;
PVOID HelperDLLContext;
DWORD HelperEvents;
- DWORD IOOptions = 0;
UNICODE_STRING TransportName;
UNICODE_STRING DevName;
LARGE_INTEGER GroupData;
0,
0);
- /* Set IO Flag */
- if ((dwFlags & WSA_FLAG_OVERLAPPED) == 0) IOOptions = FILE_SYNCHRONOUS_IO_NONALERT;
-
- /* Create the Socket */
+ /* Create the Socket as asynchronous. That means we have to block
+ ourselves after every call to NtDeviceIoControlFile. This is
+ because the kernel doesn't support overlapping synchronous I/O
+ requests (made from multiple threads) at this time (Sep 2005) */
ZwCreateFile(&Sock,
GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
&Object,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN_IF,
- IOOptions,
+ 0,
EABuffer,
SizeOfEA);
0xA + Socket->SharedData.SizeOfLocalAddress, /* Can't figure out a way to calculate this in C*/
BindData,
0xA + Socket->SharedData.SizeOfLocalAddress); /* Can't figure out a way to calculate this C */
+
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ }
/* Set up Socket Data */
Socket->SharedData.State = SocketBound;
sizeof(ListenData),
NULL,
0);
+
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ }
/* Set to Listening */
Socket->SharedData.Listening = TRUE;
sizeof(PendingAcceptData),
&PendingAcceptData,
sizeof(PendingAcceptData));
+
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
if (!NT_SUCCESS(Status)) {
NtClose( SockEvent );
PendingData,
PendingDataLength);
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
+
if (!NT_SUCCESS(Status)) {
NtClose( SockEvent );
MsafdReturnWithErrno( Status, lpErrno, 0, NULL );
NULL,
0);
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
+
NtClose( SockEvent );
if (!NT_SUCCESS(Status)) {
sizeof(AcceptData),
NULL,
0);
+
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
if (!NT_SUCCESS(Status)) {
WSPCloseSocket( AcceptSocket, lpErrno );
ConnectDataLength,
NULL,
0);
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
}
/* Dynamic Structure...ugh */
sizeof(InConnectDataLength),
NULL,
0);
+
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
}
/* AFD doesn't seem to care if these are invalid, but let's 0 them anyways */
0x22,
NULL,
0);
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
/* Get any pending connect data */
if (lpCalleeData != NULL) {
0,
lpCalleeData->buf,
lpCalleeData->len);
+ /* Wait for return */
+ if (Status == STATUS_PENDING) {
+ WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
+ }
}
/* Re-enable Async Event */