/*++ Copyright (c) 1994 Microsoft Corporation Module Name: wsctrl.c Abstract: Functions to talk to TCP/IP device driver Contents: WsControl Author: Richard L Firth (rfirth) 6-Aug-1994 Revision History: rfirth 6-Aug-1994 Created --*/ #include "precomp.h" #include "ntddip6.h" #pragma hdrstop extern CRITICAL_SECTION g_stateLock; HANDLE TcpipDriverHandle = INVALID_HANDLE_VALUE; HANDLE Ip6DriverHandle = INVALID_HANDLE_VALUE; DWORD Ip6Control( DWORD Request, LPVOID InputBuffer, LPDWORD InputBufferLength, LPVOID OutputBuffer, LPDWORD OutputBufferLength ) { BOOL ok; DWORD bytesReturned; HANDLE Handle; if (Ip6DriverHandle == INVALID_HANDLE_VALUE) { Handle = CreateFileW(WIN_IPV6_DEVICE_NAME, 0, // access mode FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // security attributes OPEN_EXISTING, 0, // flags & attributes NULL); // template file EnterCriticalSection(&g_stateLock); if (Ip6DriverHandle == INVALID_HANDLE_VALUE) { if (Handle == INVALID_HANDLE_VALUE) { LeaveCriticalSection(&g_stateLock); return GetLastError(); } else { Ip6DriverHandle = Handle; } } else { CloseHandle(Handle); } LeaveCriticalSection(&g_stateLock); } ok = DeviceIoControl(Ip6DriverHandle, Request, InputBuffer, *InputBufferLength, OutputBuffer, *OutputBufferLength, &bytesReturned, NULL ); if (!ok) { *OutputBufferLength = bytesReturned; return GetLastError(); } *OutputBufferLength = bytesReturned; return NO_ERROR; } /******************************************************************************* * * WsControl * * ENTRY Protocol - ignored * Request - ignored * InputBuffer - pointer to request buffer * InputBufferLength - pointer to DWORD: IN = request buffer length * OutputBuffer - pointer to output buffer * OutputBufferLength - pointer to DWORD: IN = length of output buffer; * OUT = length of returned data * * EXIT OutputBuffer - contains queried info if successful * OutputBufferLength - contains number of bytes in OutputBuffer if * successful * * RETURNS Success = STATUS_SUCCESS/NO_ERROR * Failure = Win32 error code * * ASSUMES * ******************************************************************************/ DWORD WsControl( DWORD Protocol, DWORD Request, LPVOID InputBuffer, LPDWORD InputBufferLength, LPVOID OutputBuffer, LPDWORD OutputBufferLength ) { BOOL ok; DWORD bytesReturned; HANDLE Handle; UNREFERENCED_PARAMETER(Request); if (Protocol == IPPROTO_IPV6) { return Ip6Control(Request, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength); } if (TcpipDriverHandle == INVALID_HANDLE_VALUE) { OBJECT_ATTRIBUTES objectAttributes; IO_STATUS_BLOCK iosb; UNICODE_STRING string; NTSTATUS status; RtlInitUnicodeString(&string, DD_TCP_DEVICE_NAME); InitializeObjectAttributes(&objectAttributes, &string, OBJ_CASE_INSENSITIVE, NULL, NULL ); status = NtCreateFile(&Handle, SYNCHRONIZE | GENERIC_EXECUTE, &objectAttributes, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); EnterCriticalSection(&g_stateLock); if (TcpipDriverHandle == INVALID_HANDLE_VALUE) { if (!NT_SUCCESS(status)) { LeaveCriticalSection(&g_stateLock); return RtlNtStatusToDosError(status); } else { TcpipDriverHandle = Handle; } } else { NtClose(Handle); } LeaveCriticalSection(&g_stateLock); } ok = DeviceIoControl(TcpipDriverHandle, IOCTL_TCP_QUERY_INFORMATION_EX, InputBuffer, *InputBufferLength, OutputBuffer, *OutputBufferLength, &bytesReturned, NULL ); if (!ok) { *OutputBufferLength = bytesReturned; return GetLastError(); } *OutputBufferLength = bytesReturned; return NO_ERROR; }