diff --git a/reactos/dll/win32/rasadhlp/autodial.c b/reactos/dll/win32/rasadhlp/autodial.c new file mode 100644 index 00000000000..20e4d5a0535 --- /dev/null +++ b/reactos/dll/win32/rasadhlp/autodial.c @@ -0,0 +1,123 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Winsock 2 SPI + * FILE: lib/mswsock/lib/init.c + * PURPOSE: DLL Initialization + */ + +/* INCLUDES ******************************************************************/ +#include "precomp.h" + +/* DATA **********************************************************************/ + +/* FUNCTIONS *****************************************************************/ + +BOOLEAN +WINAPI +AcsHlpSendCommand(IN PAUTODIAL_COMMAND Command) +{ + UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"\\Device\\RasAcd"); + NTSTATUS Status; + HANDLE DriverHandle; + HANDLE EventHandle = NULL; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + + /* Initialize the object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &DriverName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + /* Open a handle to it */ + Status = NtCreateFile(&DriverHandle, + FILE_READ_DATA | FILE_WRITE_DATA, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN_IF, + 0, + NULL, + 0); + if (!NT_SUCCESS(Status)) return FALSE; + + /* Create an event */ + EventHandle = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!EventHandle) + { + /* Event failed, fail us */ + CloseHandle(DriverHandle); + return FALSE; + } + + /* Connect to the driver */ + Status = NtDeviceIoControlFile(DriverHandle, + EventHandle, + NULL, + NULL, + &IoStatusBlock, + IOCTL_ACD_CONNECT_ADDRESS, + Command, + sizeof(AUTODIAL_COMMAND), + NULL, + 0); + + /* Check if we need to wait */ + if (Status == STATUS_PENDING) + { + /* Wait for the driver */ + Status = WaitForSingleObject(EventHandle, INFINITE); + + /* Update status */ + Status = IoStatusBlock.Status; + } + + /* Close handles and return */ + CloseHandle(EventHandle); + CloseHandle(DriverHandle); + return NT_SUCCESS(Status); +} + +/* + * @implemented + */ +BOOLEAN +WINAPI +AcsHlpAttemptConnection(IN PAUTODIAL_ADDR ConnectionAddress) +{ + AUTODIAL_COMMAND Command; + + /* Clear the command packet */ + RtlZeroMemory(&Command, sizeof(AUTODIAL_COMMAND)); + + /* Copy the address into the command packet */ + RtlCopyMemory(&Command.Address, ConnectionAddress, sizeof(AUTODIAL_ADDR)); + + /* Send it to the driver */ + return AcsHlpSendCommand(&Command); +} + +/* + * @implemented + */ +BOOLEAN +WINAPI +AcsHlpNoteNewConnection(IN PAUTODIAL_ADDR ConnectionAddress, + IN PAUTODIAL_CONN Connection) +{ + AUTODIAL_COMMAND Command; + + /* Copy the address into the command packet */ + RtlCopyMemory(&Command.Address, ConnectionAddress, sizeof(AUTODIAL_ADDR)); + + /* Set the New Connection flag and copy the connection data */ + Command.NewConnection = TRUE; + RtlCopyMemory(&Command.Connection, Connection, sizeof(AUTODIAL_CONN)); + + /* Send it to the driver */ + return AcsHlpSendCommand(&Command); +} + diff --git a/reactos/dll/win32/rasadhlp/init.c b/reactos/dll/win32/rasadhlp/init.c new file mode 100644 index 00000000000..c0c05350aaa --- /dev/null +++ b/reactos/dll/win32/rasadhlp/init.c @@ -0,0 +1,30 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Winsock 2 SPI + * FILE: lib/mswsock/lib/init.c + * PURPOSE: DLL Initialization + */ + +/* INCLUDES ******************************************************************/ +#include "precomp.h" + +/* DATA **********************************************************************/ + +/* FUNCTIONS *****************************************************************/ + +BOOLEAN +WINAPI +DllMain(HINSTANCE Instance, + DWORD Reason, + LPVOID Reserved) +{ + /* Check if we're being attached */ + if (Reason == DLL_PROCESS_ATTACH) + { + /* Let's disable TLC calls as an optimization */ + DisableThreadLibraryCalls(Instance); + } + + /* We're done */ + return TRUE; +} diff --git a/reactos/dll/win32/rasadhlp/precomp.h b/reactos/dll/win32/rasadhlp/precomp.h new file mode 100644 index 00000000000..db24ad64efa --- /dev/null +++ b/reactos/dll/win32/rasadhlp/precomp.h @@ -0,0 +1,102 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Ancillary Function Driver DLL + * FILE: include/msafd.h + * PURPOSE: Ancillary Function Driver DLL header + */ + +#define _WIN32_WINNT 0x502 +#define _CRT_SECURE_NO_DEPRECATE +#define WIN32_NO_STATUS + +/* PSDK Headers */ +#include +#include +#include +#include + +/* NDK */ +#include +#include + +/* Shared GUIDs */ +#include + +/* These should go in rasadhlp.h */ +#define FILE_DEVICE_ACD 0x000000F1 +#define _ACD_CTL_CODE(function, method, access) \ + CTL_CODE(FILE_DEVICE_ACD, function, method, access) + +#define IOCTL_ACD_RESET \ + _ACD_CTL_CODE(0, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_ACD_ENABLE \ + _ACD_CTL_CODE(1, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_ACD_NOTIFICATION \ + _ACD_CTL_CODE(2, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_ACD_KEEPALIVE \ + _ACD_CTL_CODE(3, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_ACD_COMPLETION \ + _ACD_CTL_CODE(4, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_ACD_CONNECT_ADDRESS \ + _ACD_CTL_CODE(5, METHOD_BUFFERED, FILE_READ_ACCESS) + +typedef enum +{ + AutoDialIp, + AutoDialIpx, + AutoDialNetBios, + AutoDialIpHost +} AUTODIAL_FAMILY; + +typedef enum +{ + ConnectionIpxLana, + ConnectionIp, + ConnectionIpHost, + ConnectionNetBiosMac, +} CONNECTION_FAMILY; + +typedef struct _AUTODIAL_ADDR +{ + AUTODIAL_FAMILY Family; + union + { + IN_ADDR Ip4Address; + CHAR IpxNode[6]; + CHAR NetBiosAddress[NETBIOS_NAME_LENGTH]; + CHAR HostName[INTERNET_MAX_PATH_LENGTH]; + }; +} AUTODIAL_ADDR, *PAUTODIAL_ADDR; + +typedef struct _AUTODIAL_CONN +{ + CONNECTION_FAMILY Family; + union + { + UCHAR IpxLana; + ULONG Ip4Address; + WCHAR ConnectionName[32]; + CHAR NetBiosMac[6]; + }; +} AUTODIAL_CONN, *PAUTODIAL_CONN; + +typedef struct _AUTODIAL_COMMAND +{ + AUTODIAL_ADDR Address; + BOOL NewConnection; + AUTODIAL_CONN Connection; +} AUTODIAL_COMMAND, *PAUTODIAL_COMMAND; + +BOOLEAN +WINAPI +AcsHlpNoteNewConnection( + IN PAUTODIAL_ADDR ConnectionAddress, + IN PAUTODIAL_CONN Connection +); + +BOOLEAN +WINAPI +AcsHlpAttemptConnection( + IN PAUTODIAL_ADDR ConnectionAddress +); + diff --git a/reactos/dll/win32/rasadhlp/rasadhlp.rbuild b/reactos/dll/win32/rasadhlp/rasadhlp.rbuild new file mode 100644 index 00000000000..efb5ed27779 --- /dev/null +++ b/reactos/dll/win32/rasadhlp/rasadhlp.rbuild @@ -0,0 +1,13 @@ + + + + + include/reactos/winsock + . + kernel32 + ntdll + ws2_32 + autodial.c + init.c + winsock.c + diff --git a/reactos/dll/win32/rasadhlp/rasadhlp.spec b/reactos/dll/win32/rasadhlp/rasadhlp.spec new file mode 100644 index 00000000000..baf38e8b01d --- /dev/null +++ b/reactos/dll/win32/rasadhlp/rasadhlp.spec @@ -0,0 +1,6 @@ +@ stdcall AcsHlpAttemptConnection(ptr) +@ stub AcsHlpNbConnection +@ stdcall AcsHlpNoteNewConnection(ptr ptr) +@ stdcall WSAttemptAutodialAddr(ptr long) +@ stdcall WSAttemptAutodialName(ptr) +@ stdcall WSNoteSuccessfulHostentLookup(ptr long) diff --git a/reactos/dll/win32/rasadhlp/winsock.c b/reactos/dll/win32/rasadhlp/winsock.c new file mode 100644 index 00000000000..f85661d33e6 --- /dev/null +++ b/reactos/dll/win32/rasadhlp/winsock.c @@ -0,0 +1,137 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Winsock 2 SPI + * FILE: lib/mswsock/lib/init.c + * PURPOSE: DLL Initialization + */ + +/* INCLUDES ******************************************************************/ +#include "precomp.h" + +/* DATA **********************************************************************/ + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +BOOL +WINAPI +WSAttemptAutodialAddr(IN CONST SOCKADDR FAR *Name, + IN INT NameLength) +{ + PSOCKADDR_IN Ip = (PSOCKADDR_IN)Name; + PSOCKADDR_NB NetBios = (PSOCKADDR_NB)Name; + AUTODIAL_ADDR AutodialAdddress; + + /* Check the family type */ + switch (Name->sa_family) + { + case AF_INET: + /* Normal IPv4, set the Autodial Address Data */ + AutodialAdddress.Family = AutoDialIp; + AutodialAdddress.Ip4Address = Ip->sin_addr; + break; + + case AF_NETBIOS: + /* NetBIOS, set the Autodial Address Data*/ + AutodialAdddress.Family = AutoDialNetBios; + RtlCopyMemory(&AutodialAdddress.NetBiosAddress, + NetBios->snb_name, + NETBIOS_NAME_LENGTH); + break; + + default: + /* Unsupported family type */ + return FALSE; + } + + /* Call the public routine */ + return AcsHlpAttemptConnection(&AutodialAdddress); +} + +/* + * @implemented + */ +BOOL +WINAPI +WSAttemptAutodialName(IN CONST LPWSAQUERYSETW Restrictions) +{ + AUTODIAL_ADDR AutodialAdddress; + CHAR AnsiIp[17]; + LPGUID Guid = Restrictions->lpServiceClassId; + + /* Make sure we actually have a name */ + if (!Restrictions->lpszServiceInstanceName) return FALSE; + + /* Check if this is the Hostname GUID */ + if (!memcmp(Guid, &HostnameGuid, sizeof(GUID))) + { + /* It is. Set up the Autodial Address Data */ + AutodialAdddress.Family = AutoDialIpHost; + WideCharToMultiByte(CP_ACP, + 0, + Restrictions->lpszServiceInstanceName, + -1, + AutodialAdddress.HostName, + INTERNET_MAX_PATH_LENGTH - 1, + 0, + 0); + + /* Call the public routine */ + return AcsHlpAttemptConnection(&AutodialAdddress); + } + else if (!memcmp(Guid, &AddressGuid, sizeof(GUID))) + { + /* It's actually the IP String GUID */ + AutodialAdddress.Family = AutoDialIp; + + /* Convert the IP String to ANSI and then convert it to IP */ + WideCharToMultiByte(CP_ACP, + 0, + Restrictions->lpszServiceInstanceName, + -1, + AnsiIp, + sizeof(AnsiIp) - 1, + 0, + 0); + _strlwr(AnsiIp); + AutodialAdddress.Ip4Address.S_un.S_addr = inet_addr(AnsiIp); + + /* Make sure the IP is valid */ + if (AutodialAdddress.Ip4Address.S_un.S_addr == -1) return FALSE; + + /* Call the public routine */ + return AcsHlpAttemptConnection(&AutodialAdddress); + } + else + { + /* Unknown GUID type */ + return FALSE; + } +} + +/* + * @implemented + */ +VOID +WINAPI +WSNoteSuccessfulHostentLookup(IN CONST CHAR FAR *Name, + IN CONST ULONG Address) +{ + AUTODIAL_ADDR AutodialAdddress; + AUTODIAL_CONN AutodialConnection; + + /* Make sure there actually is a name */ + if (!(Name) || !strlen(Name)) return; + + /* Setup the Address */ + AutodialAdddress.Family = AutoDialIpHost; + strcpy(AutodialAdddress.HostName, Name); + + /* Setup the new connection */ + AutodialConnection.Family = ConnectionIp; + AutodialConnection.Ip4Address = Address; + AcsHlpNoteNewConnection(&AutodialAdddress, &AutodialConnection); +} +