├── wsktcp ├── wsktcp.vcproj ├── makefile ├── sources ├── wsktcp.rc ├── wsktcp.sln ├── wsktcp.vcxproj.filters ├── simplewsk.h ├── wsktcp.vcxproj ├── wsktcp.c └── simplewsk.c ├── wskudp ├── wskudp.vcproj ├── makefile ├── sources ├── wskudp.rc ├── wskudp.sln ├── simplewsk.h ├── wskudp.c └── simplewsk.c ├── wsktcpcli ├── wsktcpcli Package │ ├── wsktcpcli Package.vcxproj.filters │ └── wsktcpcli Package.vcxproj └── wsktcpcli │ ├── wsktcpcli.inf │ ├── wsktcpcli.vcxproj.filters │ ├── simplewsk.h │ ├── wsktcpcli.sln │ ├── wsktcp.c │ ├── wsktcpcli.vcxproj │ └── simplewsk.c └── wsktcpsrv ├── wsktcpsrv Package ├── wsktcpsrv Package.vcxproj.filters └── wsktcpsrv Package.vcxproj └── wsktcpsrv ├── wsktcpsrv.inf ├── wsktcpsrv.vcxproj.filters ├── simplewsk.h ├── wsktcpsrv.sln ├── wsktcp.c ├── wsktcpsrv.vcxproj └── simplewsk.c /wsktcp/wsktcp.vcproj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reinhardvz/wsk/HEAD/wsktcp/wsktcp.vcproj -------------------------------------------------------------------------------- /wskudp/wskudp.vcproj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/reinhardvz/wsk/HEAD/wskudp/wskudp.vcproj -------------------------------------------------------------------------------- /wsktcp/makefile: -------------------------------------------------------------------------------- 1 | MINIMUM_NT_TARGET_VERSION=0x0600 2 | !include $(NTMAKEENV)\makefile.def 3 | 4 | -------------------------------------------------------------------------------- /wskudp/makefile: -------------------------------------------------------------------------------- 1 | MINIMUM_NT_TARGET_VERSION=0x0600 2 | !include $(NTMAKEENV)\makefile.def 3 | 4 | -------------------------------------------------------------------------------- /wsktcp/sources: -------------------------------------------------------------------------------- 1 | TARGETNAME=wsktcp 2 | TARGETTYPE=DRIVER 3 | 4 | MSC_WARNING_LEVEL=/W3 /WX 5 | 6 | INCLUDES=\ 7 | 8 | TARGETLIBS=\ 9 | $(DDK_LIB_PATH)\ntoskrnl.lib \ 10 | $(DDK_LIB_PATH)\netio.lib \ 11 | $(SDK_LIB_PATH)\uuid.lib 12 | 13 | SOURCES= \ 14 | wsktcp.c \ 15 | Simplewsk.c \ 16 | wsktcp.rc 17 | 18 | RUN_WPP= $(SOURCES) -km 19 | 20 | 21 | -------------------------------------------------------------------------------- /wskudp/sources: -------------------------------------------------------------------------------- 1 | TARGETNAME=wskudp 2 | TARGETTYPE=DRIVER 3 | 4 | MSC_WARNING_LEVEL=/W3 /WX 5 | 6 | INCLUDES=\ 7 | 8 | TARGETLIBS=\ 9 | $(DDK_LIB_PATH)\ntoskrnl.lib \ 10 | $(DDK_LIB_PATH)\netio.lib \ 11 | $(SDK_LIB_PATH)\uuid.lib 12 | 13 | SOURCES= \ 14 | wskudp.c \ 15 | Simplewsk.c \ 16 | wskudp.rc 17 | 18 | RUN_WPP= $(SOURCES) -km 19 | 20 | 21 | -------------------------------------------------------------------------------- /wsktcp/wsktcp.rc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define VER_FILETYPE VFT_DRV 5 | #define VER_FILESUBTYPE VFT2_DRV_SYSTEM 6 | #define VER_FILEDESCRIPTION_STR "WSK Sample TCP Echo Server" 7 | #define VER_INTERNALNAME_STR "Wskudp.sys" 8 | #define VER_ORIGINALFILENAME_STR "Wskudp.sys" 9 | 10 | #include "common.ver" 11 | 12 | 13 | -------------------------------------------------------------------------------- /wskudp/wskudp.rc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define VER_FILETYPE VFT_DRV 5 | #define VER_FILESUBTYPE VFT2_DRV_SYSTEM 6 | #define VER_FILEDESCRIPTION_STR "WSK Sample TCP Echo Server" 7 | #define VER_INTERNALNAME_STR "Wskudp.sys" 8 | #define VER_ORIGINALFILENAME_STR "Wskudp.sys" 9 | 10 | #include "common.ver" 11 | 12 | 13 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli Package/wsktcpcli Package.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {8E41214B-6785-4CFE-B992-037D68949A14} 6 | inf;inv;inx;mof;mc; 7 | 8 | 9 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv Package/wsktcpsrv Package.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {8E41214B-6785-4CFE-B992-037D68949A14} 6 | inf;inv;inx;mof;mc; 7 | 8 | 9 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/wsktcpcli.inf: -------------------------------------------------------------------------------- 1 | ; 2 | ; wsktcpcli.inf 3 | ; 4 | 5 | [Version] 6 | Signature="$WINDOWS NT$" 7 | Class= 8 | ClassGuid= 9 | Provider= 10 | DriverVer= 11 | CatalogFile= 12 | 13 | [DestinationDirs] 14 | DefaultDestDir = 12 15 | 16 | 17 | [SourceDisksNames] 18 | 1 = %DiskName%,,,"" 19 | 20 | [SourceDisksFiles] 21 | 22 | 23 | [Manufacturer] 24 | %ManufacturerName%=Standard,NT$ARCH$ 25 | 26 | [Standard.NT$ARCH$] 27 | 28 | 29 | [Strings] 30 | ManufacturerName="" 31 | ClassName="" 32 | DiskName="wsktcpcli Source Disk" 33 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/wsktcpsrv.inf: -------------------------------------------------------------------------------- 1 | ; 2 | ; wsktcpsrv.inf 3 | ; 4 | 5 | [Version] 6 | Signature="$WINDOWS NT$" 7 | Class= 8 | ClassGuid= 9 | Provider= 10 | DriverVer= 11 | CatalogFile= 12 | 13 | [DestinationDirs] 14 | DefaultDestDir = 12 15 | 16 | 17 | [SourceDisksNames] 18 | 1 = %DiskName%,,,"" 19 | 20 | [SourceDisksFiles] 21 | 22 | 23 | [Manufacturer] 24 | %ManufacturerName%=Standard,NT$ARCH$ 25 | 26 | [Standard.NT$ARCH$] 27 | 28 | 29 | [Strings] 30 | ManufacturerName="" 31 | ClassName="" 32 | DiskName="wsktcpsrv Source Disk" 33 | -------------------------------------------------------------------------------- /wskudp/wskudp.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 10.00 3 | # Visual Studio 2008 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wskudp", "wskudp.vcproj", "{AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}" 5 | EndProject 6 | Global 7 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 8 | Debug|Win32 = Debug|Win32 9 | Release|Win32 = Release|Win32 10 | EndGlobalSection 11 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 12 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Debug|Win32.ActiveCfg = Debug|Win32 13 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Debug|Win32.Build.0 = Debug|Win32 14 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Release|Win32.ActiveCfg = Release|Win32 15 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Release|Win32.Build.0 = Release|Win32 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /wsktcp/wsktcp.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.31101.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsktcp", "wsktcp.vcxproj", "{AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Release|Win32 = Release|Win32 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Debug|Win32.ActiveCfg = Debug|Win32 15 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Debug|Win32.Build.0 = Debug|Win32 16 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Release|Win32.ActiveCfg = Release|Win32 17 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5}.Release|Win32.Build.0 = Release|Win32 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /wsktcp/wsktcp.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav 15 | 16 | 17 | 18 | 19 | 소스 파일 20 | 21 | 22 | 소스 파일 23 | 24 | 25 | 26 | 27 | 헤더 파일 28 | 29 | 30 | 헤더 파일 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/wsktcpcli.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | {8E41214B-6785-4CFE-B992-037D68949A14} 18 | inf;inv;inx;mof;mc; 19 | 20 | 21 | 22 | 23 | Driver Files 24 | 25 | 26 | 27 | 28 | Source Files 29 | 30 | 31 | Source Files 32 | 33 | 34 | 35 | 36 | Header Files 37 | 38 | 39 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/wsktcpsrv.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | {8E41214B-6785-4CFE-B992-037D68949A14} 18 | inf;inv;inx;mof;mc; 19 | 20 | 21 | 22 | 23 | Driver Files 24 | 25 | 26 | 27 | 28 | Source Files 29 | 30 | 31 | Source Files 32 | 33 | 34 | 35 | 36 | Header Files 37 | 38 | 39 | -------------------------------------------------------------------------------- /wsktcp/simplewsk.h: -------------------------------------------------------------------------------- 1 | 2 | #pragma warning(push) 3 | #pragma warning(disable:4201) // nameless struct/union 4 | #pragma warning(disable:4214) // bit field types other than int 5 | 6 | #pragma once 7 | #include 8 | #include 9 | 10 | #pragma warning(pop) 11 | 12 | #define SOCKET_ERROR -1 13 | 14 | NTSTATUS NTAPI WSKStartup(); 15 | VOID NTAPI WSKCleanup(); 16 | 17 | PWSK_SOCKET 18 | NTAPI 19 | CreateSocket( 20 | __in ADDRESS_FAMILY AddressFamily, 21 | __in USHORT SocketType, 22 | __in ULONG Protocol, 23 | __in ULONG Flags 24 | ); 25 | 26 | NTSTATUS 27 | NTAPI 28 | CloseSocket( 29 | __in PWSK_SOCKET WskSocket 30 | ); 31 | 32 | NTSTATUS 33 | NTAPI 34 | Connect( 35 | __in PWSK_SOCKET WskSocket, 36 | __in PSOCKADDR RemoteAddress 37 | ); 38 | 39 | PWSK_SOCKET 40 | NTAPI 41 | SocketConnect( 42 | __in USHORT SocketType, 43 | __in ULONG Protocol, 44 | __in PSOCKADDR RemoteAddress, 45 | __in PSOCKADDR LocalAddress 46 | ); 47 | 48 | LONG 49 | NTAPI 50 | Send( 51 | __in PWSK_SOCKET WskSocket, 52 | __in PVOID Buffer, 53 | __in ULONG BufferSize, 54 | __in ULONG Flags 55 | ); 56 | 57 | LONG 58 | NTAPI 59 | SendTo( 60 | __in PWSK_SOCKET WskSocket, 61 | __in PVOID Buffer, 62 | __in ULONG BufferSize, 63 | __in_opt PSOCKADDR RemoteAddress 64 | ); 65 | 66 | LONG 67 | NTAPI 68 | Receive( 69 | __in PWSK_SOCKET WskSocket, 70 | __out PVOID Buffer, 71 | __in ULONG BufferSize, 72 | __in ULONG Flags 73 | ); 74 | 75 | LONG 76 | NTAPI 77 | ReceiveFrom( 78 | __in PWSK_SOCKET WskSocket, 79 | __out PVOID Buffer, 80 | __in ULONG BufferSize, 81 | __out_opt PSOCKADDR RemoteAddress, 82 | __out_opt PULONG ControlFlags 83 | ); 84 | 85 | NTSTATUS 86 | NTAPI 87 | Bind( 88 | __in PWSK_SOCKET WskSocket, 89 | __in PSOCKADDR LocalAddress 90 | ); 91 | 92 | PWSK_SOCKET 93 | NTAPI 94 | Accept( 95 | __in PWSK_SOCKET WskSocket, 96 | __out_opt PSOCKADDR LocalAddress, 97 | __out_opt PSOCKADDR RemoteAddress 98 | ); 99 | 100 | -------------------------------------------------------------------------------- /wskudp/simplewsk.h: -------------------------------------------------------------------------------- 1 | 2 | #pragma warning(push) 3 | #pragma warning(disable:4201) // nameless struct/union 4 | #pragma warning(disable:4214) // bit field types other than int 5 | 6 | #pragma once 7 | #include 8 | #include 9 | 10 | #pragma warning(pop) 11 | 12 | #define SOCKET_ERROR -1 13 | 14 | NTSTATUS NTAPI WSKStartup(); 15 | VOID NTAPI WSKCleanup(); 16 | 17 | PWSK_SOCKET 18 | NTAPI 19 | CreateSocket( 20 | __in ADDRESS_FAMILY AddressFamily, 21 | __in USHORT SocketType, 22 | __in ULONG Protocol, 23 | __in ULONG Flags 24 | ); 25 | 26 | NTSTATUS 27 | NTAPI 28 | CloseSocket( 29 | __in PWSK_SOCKET WskSocket 30 | ); 31 | 32 | NTSTATUS 33 | NTAPI 34 | Connect( 35 | __in PWSK_SOCKET WskSocket, 36 | __in PSOCKADDR RemoteAddress 37 | ); 38 | 39 | PWSK_SOCKET 40 | NTAPI 41 | SocketConnect( 42 | __in USHORT SocketType, 43 | __in ULONG Protocol, 44 | __in PSOCKADDR RemoteAddress, 45 | __in PSOCKADDR LocalAddress 46 | ); 47 | 48 | LONG 49 | NTAPI 50 | Send( 51 | __in PWSK_SOCKET WskSocket, 52 | __in PVOID Buffer, 53 | __in ULONG BufferSize, 54 | __in ULONG Flags 55 | ); 56 | 57 | LONG 58 | NTAPI 59 | SendTo( 60 | __in PWSK_SOCKET WskSocket, 61 | __in PVOID Buffer, 62 | __in ULONG BufferSize, 63 | __in_opt PSOCKADDR RemoteAddress 64 | ); 65 | 66 | LONG 67 | NTAPI 68 | Receive( 69 | __in PWSK_SOCKET WskSocket, 70 | __out PVOID Buffer, 71 | __in ULONG BufferSize, 72 | __in ULONG Flags 73 | ); 74 | 75 | LONG 76 | NTAPI 77 | ReceiveFrom( 78 | __in PWSK_SOCKET WskSocket, 79 | __out PVOID Buffer, 80 | __in ULONG BufferSize, 81 | __out_opt PSOCKADDR RemoteAddress, 82 | __out_opt PULONG ControlFlags 83 | ); 84 | 85 | NTSTATUS 86 | NTAPI 87 | Bind( 88 | __in PWSK_SOCKET WskSocket, 89 | __in PSOCKADDR LocalAddress 90 | ); 91 | 92 | PWSK_SOCKET 93 | NTAPI 94 | Accept( 95 | __in PWSK_SOCKET WskSocket, 96 | __out_opt PSOCKADDR LocalAddress, 97 | __out_opt PSOCKADDR RemoteAddress 98 | ); 99 | 100 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/simplewsk.h: -------------------------------------------------------------------------------- 1 | 2 | #pragma warning(push) 3 | #pragma warning(disable:4201) // nameless struct/union 4 | #pragma warning(disable:4214) // bit field types other than int 5 | 6 | #pragma once 7 | #include 8 | #include 9 | 10 | #pragma warning(pop) 11 | 12 | #define SOCKET_ERROR -1 13 | 14 | NTSTATUS NTAPI WSKStartup(); 15 | VOID NTAPI WSKCleanup(); 16 | 17 | PWSK_SOCKET 18 | NTAPI 19 | CreateSocket( 20 | __in ADDRESS_FAMILY AddressFamily, 21 | __in USHORT SocketType, 22 | __in ULONG Protocol, 23 | __in ULONG Flags 24 | ); 25 | 26 | NTSTATUS 27 | NTAPI 28 | CloseSocket( 29 | __in PWSK_SOCKET WskSocket 30 | ); 31 | 32 | NTSTATUS 33 | NTAPI 34 | Connect( 35 | __in PWSK_SOCKET WskSocket, 36 | __in PSOCKADDR RemoteAddress 37 | ); 38 | 39 | PWSK_SOCKET 40 | NTAPI 41 | SocketConnect( 42 | __in USHORT SocketType, 43 | __in ULONG Protocol, 44 | __in PSOCKADDR RemoteAddress, 45 | __in PSOCKADDR LocalAddress 46 | ); 47 | 48 | NTSTATUS 49 | NTAPI 50 | DisConnect( 51 | __in PWSK_SOCKET pWskSocket 52 | ); 53 | 54 | LONG 55 | NTAPI 56 | Send( 57 | __in PWSK_SOCKET WskSocket, 58 | __in PVOID Buffer, 59 | __in ULONG BufferSize, 60 | __in ULONG Flags 61 | ); 62 | 63 | LONG 64 | NTAPI 65 | SendTo( 66 | __in PWSK_SOCKET WskSocket, 67 | __in PVOID Buffer, 68 | __in ULONG BufferSize, 69 | __in_opt PSOCKADDR RemoteAddress 70 | ); 71 | 72 | LONG 73 | NTAPI 74 | Receive( 75 | __in PWSK_SOCKET WskSocket, 76 | __out PVOID Buffer, 77 | __in ULONG BufferSize, 78 | __in ULONG Flags 79 | ); 80 | 81 | LONG 82 | NTAPI 83 | ReceiveFrom( 84 | __in PWSK_SOCKET WskSocket, 85 | __out PVOID Buffer, 86 | __in ULONG BufferSize, 87 | __out_opt PSOCKADDR RemoteAddress, 88 | __out_opt PULONG ControlFlags 89 | ); 90 | 91 | NTSTATUS 92 | NTAPI 93 | Bind( 94 | __in PWSK_SOCKET WskSocket, 95 | __in PSOCKADDR LocalAddress 96 | ); 97 | 98 | PWSK_SOCKET 99 | NTAPI 100 | Accept( 101 | __in PWSK_SOCKET WskSocket, 102 | __out_opt PSOCKADDR LocalAddress, 103 | __out_opt PSOCKADDR RemoteAddress 104 | ); 105 | 106 | 107 | NTSTATUS 108 | InitWskBuffer( 109 | __in PVOID Buffer, 110 | __in ULONG BufferSize, 111 | __out PWSK_BUF WskBuffer 112 | ); 113 | 114 | VOID 115 | FreeWskBuffer( 116 | __in PWSK_BUF WskBuffer 117 | ); 118 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/simplewsk.h: -------------------------------------------------------------------------------- 1 | 2 | #pragma warning(push) 3 | #pragma warning(disable:4201) // nameless struct/union 4 | #pragma warning(disable:4214) // bit field types other than int 5 | 6 | #pragma once 7 | #include 8 | #include 9 | 10 | #pragma warning(pop) 11 | 12 | #define SOCKET_ERROR -1 13 | 14 | NTSTATUS NTAPI WSKStartup(); 15 | VOID NTAPI WSKCleanup(); 16 | 17 | PWSK_SOCKET 18 | NTAPI 19 | CreateSocket( 20 | __in ADDRESS_FAMILY AddressFamily, 21 | __in USHORT SocketType, 22 | __in ULONG Protocol, 23 | __in ULONG Flags 24 | ); 25 | 26 | NTSTATUS 27 | NTAPI 28 | CloseSocket( 29 | __in PWSK_SOCKET WskSocket 30 | ); 31 | 32 | NTSTATUS 33 | NTAPI 34 | Connect( 35 | __in PWSK_SOCKET WskSocket, 36 | __in PSOCKADDR RemoteAddress 37 | ); 38 | 39 | PWSK_SOCKET 40 | NTAPI 41 | SocketConnect( 42 | __in USHORT SocketType, 43 | __in ULONG Protocol, 44 | __in PSOCKADDR RemoteAddress, 45 | __in PSOCKADDR LocalAddress 46 | ); 47 | 48 | NTSTATUS 49 | NTAPI 50 | DisConnect( 51 | __in PWSK_SOCKET pWskSocket 52 | ); 53 | 54 | LONG 55 | NTAPI 56 | Send( 57 | __in PWSK_SOCKET WskSocket, 58 | __in PVOID Buffer, 59 | __in ULONG BufferSize, 60 | __in ULONG Flags 61 | ); 62 | 63 | LONG 64 | NTAPI 65 | SendTo( 66 | __in PWSK_SOCKET WskSocket, 67 | __in PVOID Buffer, 68 | __in ULONG BufferSize, 69 | __in_opt PSOCKADDR RemoteAddress 70 | ); 71 | 72 | LONG 73 | NTAPI 74 | Receive( 75 | __in PWSK_SOCKET WskSocket, 76 | __out PVOID Buffer, 77 | __in ULONG BufferSize, 78 | __in ULONG Flags 79 | ); 80 | 81 | LONG 82 | NTAPI 83 | ReceiveFrom( 84 | __in PWSK_SOCKET WskSocket, 85 | __out PVOID Buffer, 86 | __in ULONG BufferSize, 87 | __out_opt PSOCKADDR RemoteAddress, 88 | __out_opt PULONG ControlFlags 89 | ); 90 | 91 | NTSTATUS 92 | NTAPI 93 | Bind( 94 | __in PWSK_SOCKET WskSocket, 95 | __in PSOCKADDR LocalAddress 96 | ); 97 | 98 | PWSK_SOCKET 99 | NTAPI 100 | Accept( 101 | __in PWSK_SOCKET WskSocket, 102 | __out_opt PSOCKADDR LocalAddress, 103 | __out_opt PSOCKADDR RemoteAddress 104 | ); 105 | 106 | 107 | NTSTATUS 108 | InitWskBuffer( 109 | __in PVOID Buffer, 110 | __in ULONG BufferSize, 111 | __out PWSK_BUF WskBuffer 112 | ); 113 | 114 | VOID 115 | FreeWskBuffer( 116 | __in PWSK_BUF WskBuffer 117 | ); 118 | 119 | NTSTATUS 120 | NTAPI 121 | GetRemoteAddress( 122 | __in PWSK_SOCKET WskSocket, 123 | __out PSOCKADDR pRemoteAddress 124 | ); -------------------------------------------------------------------------------- /wsktcp/wsktcp.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | 14 | {AE966FD2-398E-4683-B2F4-D3BCBEA6ADB5} 15 | MakeFileProj 16 | 17 | 18 | 19 | Makefile 20 | v120 21 | 22 | 23 | Makefile 24 | v120 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | <_ProjectFileVersion>12.0.30501.0 38 | 39 | 40 | $(Configuration)\ 41 | $(Configuration)\ 42 | .\ddkbuild.cmd -WLH checked . -cZ 43 | .\ddkbuild.cmd -WLH checked . -cZ 44 | 45 | wsktcp.sys 46 | WIN32;_DEBUG;$(NMakePreprocessorDefinitions) 47 | 48 | 49 | $(Configuration)\ 50 | $(Configuration)\ 51 | .\ddkbuild.cmd -WLH free . -cZ 52 | .\ddkbuild.cmd -WLH free . -cZ 53 | 54 | wsktcp.sys 55 | WIN32;NDEBUG;$(NMakePreprocessorDefinitions) 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /wskudp/wskudp.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | 4 | Module Name: 5 | 6 | Wskudp.c 7 | 8 | Author: 9 | reinhard v.z. 10 | 11 | http://zpacket.blogspot.kr/ 12 | 13 | Environment: 14 | 15 | Kernel-Mode only 16 | 17 | Revision History: 18 | 19 | --*/ 20 | 21 | #pragma warning(push) 22 | #pragma warning(disable:4201) // nameless struct/union 23 | #pragma warning(disable:4214) // bit field types other than int 24 | 25 | #include 26 | #include 27 | #include "simplewsk.h" 28 | 29 | 30 | #pragma warning(pop) 31 | 32 | // Software Tracing definitions 33 | #define WPP_CONTROL_GUIDS \ 34 | WPP_DEFINE_CONTROL_GUID(WskudpCtlGuid, \ 35 | (998bdf51, 0349, 4fbc, 870c, d6130a955a5f), \ 36 | WPP_DEFINE_BIT(TRCERROR) \ 37 | WPP_DEFINE_BIT(TRCINFO) ) 38 | 39 | #include "wskudp.tmh" 40 | 41 | // Pool tags used for memory allocations 42 | #define WSKUDP_SOCKET_POOL_TAG ((ULONG)'sksw') 43 | #define WSKUDP_BUFFER_POOL_TAG ((ULONG)'bksw') 44 | #define WSKUDP_GENERIC_POOL_TAG ((ULONG)'xksw') 45 | 46 | // Default length for data buffers used in send and receive operations 47 | 48 | static PWSK_SOCKET g_UdpSocket = NULL; 49 | 50 | #define LOG_PORT 3000 51 | 52 | #define HTON_SHORT(n) (((((unsigned short)(n) & 0xFFu )) << 8) | \ 53 | (((unsigned short)(n) & 0xFF00u) >> 8)) 54 | 55 | #define HTON_LONG(x) (((((x)& 0xff)<<24) | ((x)>>24) & 0xff) | \ 56 | (((x) & 0xff0000)>>8) | (((x) & 0xff00)<<8)) 57 | 58 | VOID 59 | WskudpUnload( 60 | __in PDRIVER_OBJECT DriverObject 61 | ); 62 | 63 | // Driver entry routine 64 | NTSTATUS 65 | DriverEntry( 66 | __in PDRIVER_OBJECT DriverObject, 67 | __in PUNICODE_STRING RegistryPath 68 | ) 69 | { 70 | NTSTATUS status = STATUS_SUCCESS; 71 | SOCKADDR_IN LocalAddress = {0,}; 72 | SOCKADDR_IN RemoteAddress = {0,}; 73 | 74 | LONG BufferSize = 0; 75 | CHAR GreetMessage[] = "Hello there\r\n"; 76 | 77 | //PWSK_SOCKET Socket = NULL; 78 | 79 | UNREFERENCED_PARAMETER(RegistryPath); 80 | 81 | PAGED_CODE(); 82 | 83 | 84 | 85 | DriverObject->DriverUnload = WskudpUnload; 86 | 87 | status = WSKStartup(); 88 | 89 | g_UdpSocket = CreateSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, WSK_FLAG_DATAGRAM_SOCKET); 90 | if (g_UdpSocket == NULL) { 91 | DbgPrint("DriverEntry(): CreateSocket() returned NULL\n"); 92 | return (status = STATUS_UNSUCCESSFUL); 93 | } 94 | 95 | LocalAddress.sin_family = AF_INET; 96 | LocalAddress.sin_addr.s_addr = INADDR_ANY; 97 | //LocalAddress.sin_port = INADDR_PORT; 98 | 99 | // Bind Required 100 | status = Bind(g_UdpSocket, (PSOCKADDR)&LocalAddress); 101 | if (!NT_SUCCESS(status)) { 102 | DbgPrint("Bind() failed with status 0x%08X\n", status); 103 | CloseSocket(g_UdpSocket); 104 | return status; 105 | } 106 | 107 | RemoteAddress.sin_family = AF_INET; 108 | RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK);//HTON_LONG(0xc0a802a2);//HTON_LONG(INADDR_LOOPBACK); 109 | RemoteAddress.sin_port = HTON_SHORT(LOG_PORT); 110 | 111 | 112 | if (SendTo(g_UdpSocket, GreetMessage, sizeof(GreetMessage)-1, (PSOCKADDR)&RemoteAddress) == sizeof(GreetMessage)-1) { 113 | } else { 114 | 115 | } 116 | 117 | CloseSocket(g_UdpSocket); 118 | 119 | // Initialize software tracing 120 | WPP_INIT_TRACING(DriverObject, RegistryPath); 121 | 122 | DoTraceMessage(TRCINFO, "LOADED"); 123 | 124 | return status; 125 | } 126 | 127 | // Driver unload routine 128 | VOID 129 | WskudpUnload( 130 | __in PDRIVER_OBJECT DriverObject 131 | ) 132 | { 133 | 134 | UNREFERENCED_PARAMETER(DriverObject); 135 | 136 | PAGED_CODE(); 137 | 138 | DoTraceMessage(TRCINFO, "UNLOAD START"); 139 | 140 | WSKCleanup(); 141 | 142 | DoTraceMessage(TRCINFO, "UNLOAD END"); 143 | 144 | WPP_CLEANUP(DriverObject); 145 | } 146 | 147 | -------------------------------------------------------------------------------- /wsktcp/wsktcp.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | 4 | Module Name: 5 | 6 | Wskudp.c 7 | 8 | Author: 9 | reinhard v.z. 10 | 11 | http://zpacket.blogspot.kr/ 12 | 13 | Environment: 14 | 15 | Kernel-Mode only 16 | 17 | Revision History: 18 | 19 | --*/ 20 | 21 | #pragma warning(push) 22 | #pragma warning(disable:4201) // nameless struct/union 23 | #pragma warning(disable:4214) // bit field types other than int 24 | 25 | #include 26 | #include 27 | #include "simplewsk.h" 28 | 29 | 30 | #pragma warning(pop) 31 | 32 | // Software Tracing definitions 33 | #define WPP_CONTROL_GUIDS \ 34 | WPP_DEFINE_CONTROL_GUID(WsktcpCtlGuid, \ 35 | (998bdf51, 0349, 4fbc, 870c, d6130a955a5f), \ 36 | WPP_DEFINE_BIT(TRCERROR) \ 37 | WPP_DEFINE_BIT(TRCINFO) ) 38 | 39 | #include "wsktcp.tmh" 40 | 41 | // Pool tags used for memory allocations 42 | #define WSKTCP_SOCKET_POOL_TAG ((ULONG)'sksw') 43 | #define WSKTCP_BUFFER_POOL_TAG ((ULONG)'bksw') 44 | #define WSKTCP_GENERIC_POOL_TAG ((ULONG)'xksw') 45 | 46 | // Default length for data buffers used in send and receive operations 47 | 48 | static PWSK_SOCKET g_TcpSocket = NULL; 49 | 50 | #define LOG_PORT 3000 51 | 52 | #define HTON_SHORT(n) (((((unsigned short)(n) & 0xFFu )) << 8) | \ 53 | (((unsigned short)(n) & 0xFF00u) >> 8)) 54 | 55 | #define HTON_LONG(x) (((((x)& 0xff)<<24) | ((x)>>24) & 0xff) | \ 56 | (((x) & 0xff0000)>>8) | (((x) & 0xff00)<<8)) 57 | 58 | VOID 59 | WsktcpUnload( 60 | __in PDRIVER_OBJECT DriverObject 61 | ); 62 | 63 | // Driver entry routine 64 | NTSTATUS 65 | DriverEntry( 66 | __in PDRIVER_OBJECT DriverObject, 67 | __in PUNICODE_STRING RegistryPath 68 | ) 69 | { 70 | NTSTATUS status = STATUS_SUCCESS; 71 | SOCKADDR_IN LocalAddress = {0,}; 72 | SOCKADDR_IN RemoteAddress = {0,}; 73 | 74 | LONG BufferSize = 0; 75 | CHAR GreetMessage[] = "Hello WSK TCP Client \r\n"; 76 | 77 | UNREFERENCED_PARAMETER(RegistryPath); 78 | 79 | PAGED_CODE(); 80 | 81 | DriverObject->DriverUnload = WsktcpUnload; 82 | 83 | status = WSKStartup(); 84 | 85 | g_TcpSocket = CreateSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, WSK_FLAG_CONNECTION_SOCKET); 86 | if (g_TcpSocket == NULL) { 87 | DbgPrint("DriverEntry(): CreateSocket() returned NULL\n"); 88 | return (status = STATUS_UNSUCCESSFUL); 89 | } 90 | 91 | LocalAddress.sin_family = AF_INET; 92 | LocalAddress.sin_addr.s_addr = INADDR_ANY; 93 | //LocalAddress.sin_port = INADDR_PORT; 94 | 95 | // Bind Required 96 | status = Bind(g_TcpSocket, (PSOCKADDR)&LocalAddress); 97 | if (!NT_SUCCESS(status)) { 98 | DbgPrint("Bind() failed with status 0x%08X\n", status); 99 | CloseSocket(g_TcpSocket); 100 | return status; 101 | } 102 | 103 | RemoteAddress.sin_family = AF_INET; 104 | RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK); 105 | RemoteAddress.sin_port = HTON_SHORT(LOG_PORT); 106 | 107 | status = Connect(g_TcpSocket, (PSOCKADDR)&RemoteAddress); 108 | if (!NT_SUCCESS(status)) { 109 | DbgPrint("Connect() failed with status 0x%08X\n", status); 110 | CloseSocket(g_TcpSocket); 111 | return status; 112 | } 113 | 114 | if (Send(g_TcpSocket, GreetMessage, sizeof(GreetMessage)-1, WSK_FLAG_NODELAY) == sizeof(GreetMessage)-1) { 115 | } else { 116 | 117 | } 118 | 119 | CloseSocket(g_TcpSocket); 120 | 121 | // Initialize software tracing 122 | WPP_INIT_TRACING(DriverObject, RegistryPath); 123 | 124 | DoTraceMessage(TRCINFO, "LOADED"); 125 | 126 | return status; 127 | } 128 | 129 | // Driver unload routine 130 | VOID 131 | WsktcpUnload( 132 | __in PDRIVER_OBJECT DriverObject 133 | ) 134 | { 135 | 136 | UNREFERENCED_PARAMETER(DriverObject); 137 | 138 | PAGED_CODE(); 139 | 140 | DoTraceMessage(TRCINFO, "UNLOAD START"); 141 | 142 | WSKCleanup(); 143 | 144 | DoTraceMessage(TRCINFO, "UNLOAD END"); 145 | 146 | WPP_CLEANUP(DriverObject); 147 | } 148 | 149 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/wsktcpcli.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsktcpcli", "wsktcpcli.vcxproj", "{AD3B03AC-5CBB-4684-84A2-AA940EEEF935}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsktcpcli Package", "..\wsktcpcli Package\wsktcpcli Package.vcxproj", "{CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}" 9 | ProjectSection(ProjectDependencies) = postProject 10 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935} = {AD3B03AC-5CBB-4684-84A2-AA940EEEF935} 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Win7 Debug|Win32 = Win7 Debug|Win32 16 | Win7 Debug|x64 = Win7 Debug|x64 17 | Win7 Release|Win32 = Win7 Release|Win32 18 | Win7 Release|x64 = Win7 Release|x64 19 | Win8 Debug|Win32 = Win8 Debug|Win32 20 | Win8 Debug|x64 = Win8 Debug|x64 21 | Win8 Release|Win32 = Win8 Release|Win32 22 | Win8 Release|x64 = Win8 Release|x64 23 | Win8.1 Debug|Win32 = Win8.1 Debug|Win32 24 | Win8.1 Debug|x64 = Win8.1 Debug|x64 25 | Win8.1 Release|Win32 = Win8.1 Release|Win32 26 | Win8.1 Release|x64 = Win8.1 Release|x64 27 | EndGlobalSection 28 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 29 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 30 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 31 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 32 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 33 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 34 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 35 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 36 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 37 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 38 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 39 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Release|x64.Build.0 = Win7 Release|x64 40 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 41 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 42 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 43 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 44 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 45 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 46 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 47 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 48 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 49 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 50 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 51 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Release|x64.Build.0 = Win8 Release|x64 52 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 53 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 54 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 55 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 56 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 57 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 58 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 59 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 60 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 61 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 62 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 63 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 64 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 65 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 66 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 67 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 68 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 69 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 70 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 71 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 72 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 73 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 74 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 75 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Release|x64.Build.0 = Win7 Release|x64 76 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 77 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 78 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 79 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 80 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 81 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 82 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 83 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 84 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 85 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 86 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 87 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Release|x64.Build.0 = Win8 Release|x64 88 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 89 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 90 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 91 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 92 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 93 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 94 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 95 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 96 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 97 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 98 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 99 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 100 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 101 | EndGlobalSection 102 | GlobalSection(SolutionProperties) = preSolution 103 | HideSolutionNode = FALSE 104 | EndGlobalSection 105 | EndGlobal 106 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/wsktcpsrv.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.40629.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsktcpsrv", "wsktcpsrv.vcxproj", "{11747F5B-B1C1-4763-B5D6-A62C7DA3944C}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wsktcpsrv Package", "..\wsktcpsrv Package\wsktcpsrv Package.vcxproj", "{7F4457B1-9719-414C-8B09-6388181B25C4}" 9 | ProjectSection(ProjectDependencies) = postProject 10 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C} = {11747F5B-B1C1-4763-B5D6-A62C7DA3944C} 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Win7 Debug|Win32 = Win7 Debug|Win32 16 | Win7 Debug|x64 = Win7 Debug|x64 17 | Win7 Release|Win32 = Win7 Release|Win32 18 | Win7 Release|x64 = Win7 Release|x64 19 | Win8 Debug|Win32 = Win8 Debug|Win32 20 | Win8 Debug|x64 = Win8 Debug|x64 21 | Win8 Release|Win32 = Win8 Release|Win32 22 | Win8 Release|x64 = Win8 Release|x64 23 | Win8.1 Debug|Win32 = Win8.1 Debug|Win32 24 | Win8.1 Debug|x64 = Win8.1 Debug|x64 25 | Win8.1 Release|Win32 = Win8.1 Release|Win32 26 | Win8.1 Release|x64 = Win8.1 Release|x64 27 | EndGlobalSection 28 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 29 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 30 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 31 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 32 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 33 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 34 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 35 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 36 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 37 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 38 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 39 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Release|x64.Build.0 = Win7 Release|x64 40 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 41 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 42 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 43 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 44 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 45 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 46 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 47 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 48 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 49 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 50 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 51 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Release|x64.Build.0 = Win8 Release|x64 52 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 53 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 54 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 55 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 56 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 57 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 58 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 59 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 60 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 61 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 62 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 63 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 64 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 65 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32 66 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32 67 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32 68 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64 69 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Debug|x64.Build.0 = Win7 Debug|x64 70 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64 71 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32 72 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Release|Win32.Build.0 = Win7 Release|Win32 73 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32 74 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Release|x64.ActiveCfg = Win7 Release|x64 75 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Release|x64.Build.0 = Win7 Release|x64 76 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win7 Release|x64.Deploy.0 = Win7 Release|x64 77 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32 78 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32 79 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32 80 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64 81 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Debug|x64.Build.0 = Win8 Debug|x64 82 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64 83 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32 84 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Release|Win32.Build.0 = Win8 Release|Win32 85 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32 86 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Release|x64.ActiveCfg = Win8 Release|x64 87 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Release|x64.Build.0 = Win8 Release|x64 88 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8 Release|x64.Deploy.0 = Win8 Release|x64 89 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32 90 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32 91 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32 92 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64 93 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64 94 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64 95 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32 96 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32 97 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32 98 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64 99 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64 100 | {7F4457B1-9719-414C-8B09-6388181B25C4}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64 101 | EndGlobalSection 102 | GlobalSection(SolutionProperties) = preSolution 103 | HideSolutionNode = FALSE 104 | EndGlobalSection 105 | EndGlobal 106 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/wsktcp.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | 4 | Module Name: 5 | 6 | wsktcp.c 7 | 8 | Author: 9 | reinhard v.z. 10 | 11 | https://github.com/reinhardvz 12 | 13 | Environment: 14 | 15 | Kernel-Mode only 16 | 17 | Revision History: 18 | 19 | --*/ 20 | 21 | #pragma warning(push) 22 | #pragma warning(disable:4201) // nameless struct/union 23 | #pragma warning(disable:4214) // bit field types other than int 24 | 25 | #include 26 | #include 27 | #include "simplewsk.h" 28 | 29 | 30 | #pragma warning(pop) 31 | 32 | 33 | // Pool tags used for memory allocations 34 | #define WSKTCP_SOCKET_POOL_TAG ((ULONG)'sksw') 35 | #define WSKTCP_BUFFER_POOL_TAG ((ULONG)'bksw') 36 | #define WSKTCP_GENERIC_POOL_TAG ((ULONG)'xksw') 37 | 38 | // Default length for data buffers used in send and receive operations 39 | 40 | static PWSK_SOCKET g_TcpSocket = NULL; 41 | PETHREAD gEThread = NULL; 42 | SOCKADDR_IN LocalAddress = { 0, }; 43 | SOCKADDR_IN RemoteAddress = { 0, }; 44 | 45 | LONG BufferSize = 0; 46 | ULONG ByteCount = 0; 47 | CHAR GreetMessage[10] = "hello WSK"; 48 | CHAR* pRxBuf = NULL; 49 | BOOLEAN bStopThread = FALSE; 50 | 51 | 52 | #define SRV_PORT 40007 53 | 54 | #define HTON_SHORT(n) (((((unsigned short)(n) & 0xFFu )) << 8) | \ 55 | (((unsigned short)(n) & 0xFF00u) >> 8)) 56 | 57 | #define HTON_LONG(x) (((((unsigned long)(x)& 0xff)<<24) | ((unsigned long)(x)>>24) & 0xff) | \ 58 | (((unsigned long)(x) & 0xff0000)>>8) | (((unsigned long)(x) & 0xff00)<<8)) 59 | 60 | NTSTATUS 61 | AsyncSendComplete( 62 | PDEVICE_OBJECT DeviceObject, 63 | PIRP Irp, 64 | PVOID Context 65 | ); 66 | 67 | VOID 68 | WsktcpUnload( 69 | __in PDRIVER_OBJECT DriverObject 70 | ); 71 | 72 | VOID 73 | TcpSendWorker( 74 | __in PVOID Context 75 | ); 76 | 77 | // Driver entry routine 78 | NTSTATUS 79 | DriverEntry( 80 | __in PDRIVER_OBJECT DriverObject, 81 | __in PUNICODE_STRING RegistryPath 82 | ) 83 | { 84 | NTSTATUS status = STATUS_SUCCESS; 85 | 86 | HANDLE hThread = NULL; 87 | UNREFERENCED_PARAMETER(RegistryPath); 88 | 89 | PAGED_CODE(); 90 | 91 | DriverObject->DriverUnload = WsktcpUnload; 92 | 93 | pRxBuf = (CHAR*)ExAllocatePoolWithTag(NonPagedPool, 10, 'dddd'); 94 | 95 | status = WSKStartup(); 96 | if (!NT_SUCCESS(status)) { 97 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "WSKStartup failed with status 0x%08X\n", status); 98 | ExFreePool(pRxBuf); 99 | return status; 100 | } 101 | 102 | status = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, TcpSendWorker, NULL); 103 | if (!NT_SUCCESS(status)) { 104 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "thread Create failed with status 0x%08X\n", status); 105 | ExFreePool(pRxBuf); 106 | CloseSocket(g_TcpSocket); 107 | return status; 108 | } 109 | 110 | status = ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID*)&gEThread, NULL); 111 | if (NT_SUCCESS(status) == FALSE) { 112 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "ObReferenceObjectByHandle failed with status 0x%08X\n", status); 113 | ExFreePool(pRxBuf); 114 | CloseSocket(g_TcpSocket); 115 | return status; 116 | } 117 | ZwClose(hThread); 118 | 119 | return status; 120 | } 121 | 122 | #define ASYNC_SEND_TEST 0 123 | #define CONNECT_SEND_TEST 1 124 | ULONG ltest1 = 0; 125 | ULONG ltest2 = 0; 126 | 127 | VOID 128 | TcpSendWorker( 129 | __in PVOID Context 130 | ) 131 | { 132 | UNREFERENCED_PARAMETER(Context); 133 | 134 | NTSTATUS status = STATUS_SUCCESS; 135 | LARGE_INTEGER interval; 136 | RemoteAddress.sin_family = AF_INET; 137 | //RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK); 138 | RemoteAddress.sin_addr.s_addr = HTON_LONG(0x0a0a00f6); //10.10.0.232 test 139 | RemoteAddress.sin_port = HTON_SHORT(SRV_PORT); //40007 140 | 141 | #if CONNECT_SEND_TEST 142 | g_TcpSocket = CreateSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, WSK_FLAG_CONNECTION_SOCKET); 143 | if (g_TcpSocket == NULL) { 144 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "CreateSocket() returned NULL\n"); 145 | goto $EXIT; 146 | } 147 | 148 | LocalAddress.sin_family = AF_INET; 149 | LocalAddress.sin_addr.s_addr = INADDR_ANY; 150 | 151 | // Bind Required 152 | status = Bind(g_TcpSocket, (PSOCKADDR)&LocalAddress); 153 | if (!NT_SUCCESS(status)) { 154 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Bind() failed with status 0x%08X\n", status); 155 | goto $EXIT; 156 | } 157 | 158 | status = Connect(g_TcpSocket, (PSOCKADDR)&RemoteAddress); 159 | if (!NT_SUCCESS(status)) { 160 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Connect() failed with status 0x%08X\n", status); 161 | goto $EXIT; 162 | } 163 | 164 | while (!bStopThread) { 165 | 166 | interval.QuadPart = (-1 * 1000 * 10000); // wait 1000ms relative 167 | 168 | KeDelayExecutionThread(KernelMode, TRUE, &interval); 169 | 170 | if (Send(g_TcpSocket, GreetMessage, 10, WSK_FLAG_NODELAY) == sizeof(GreetMessage)) { 171 | //DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "send ok\n "); 172 | } else { 173 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "send error happend\n "); 174 | goto $EXIT; 175 | } 176 | 177 | if (Receive(g_TcpSocket, pRxBuf, 10, 0)) { 178 | 179 | } 180 | else { 181 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Receive fail\n "); 182 | goto $EXIT; 183 | } 184 | 185 | } 186 | 187 | #endif 188 | 189 | #if ASYNC_SEND_TEST 190 | g_TcpSocket = CreateSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, WSK_FLAG_CONNECTION_SOCKET); 191 | if (g_TcpSocket == NULL) { 192 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "CreateSocket() returned NULL\n"); 193 | goto $EXIT; 194 | } 195 | 196 | LocalAddress.sin_family = AF_INET; 197 | LocalAddress.sin_addr.s_addr = INADDR_ANY; 198 | 199 | // Bind Required 200 | status = Bind(g_TcpSocket, (PSOCKADDR)&LocalAddress); 201 | if (!NT_SUCCESS(status)) { 202 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Bind() failed with status 0x%08X\n", status); 203 | goto $EXIT; 204 | } 205 | 206 | status = Connect(g_TcpSocket, (PSOCKADDR)&RemoteAddress); 207 | if (!NT_SUCCESS(status)) { 208 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Connect() failed with status 0x%08X\n", status); 209 | goto $EXIT; 210 | } 211 | 212 | 213 | InitWskBuffer(GreetMessage, sizeof(GreetMessage) - 1, &WskBuffer); 214 | 215 | while (!bStopThread) { 216 | PIRP Irp; 217 | 218 | 219 | interval.QuadPart = (-1 * 1000 * 1000 * 10); // wait 1 sec relative 220 | 221 | KeDelayExecutionThread(KernelMode, TRUE, &interval); 222 | // Allocate an IRP 223 | Irp = IoAllocateIrp( 1, FALSE ); 224 | // Check result 225 | if (!Irp) { 226 | goto $EXIT; 227 | } 228 | 229 | // Set the completion routine for the IRP 230 | IoSetCompletionRoutine(Irp, AsyncSendComplete , &WskBuffer, TRUE, TRUE, TRUE); 231 | 232 | //g_TcpSocket->Dispatch->WskSend(g_TcpSocket, WskBuffer, 0, Irp); 233 | ((PWSK_PROVIDER_CONNECTION_DISPATCH)g_TcpSocket->Dispatch)->WskSend(g_TcpSocket, &WskBuffer, 0, Irp); 234 | 235 | } 236 | 237 | #endif 238 | 239 | $EXIT: 240 | if (g_TcpSocket) { 241 | CloseSocket(g_TcpSocket); 242 | g_TcpSocket = NULL; 243 | } 244 | 245 | PsTerminateSystemThread(STATUS_SUCCESS); 246 | return; 247 | } 248 | 249 | NTSTATUS 250 | AsyncSendComplete( 251 | PDEVICE_OBJECT DeviceObject, 252 | PIRP Irp, 253 | PVOID Context 254 | ) 255 | { 256 | 257 | PWSK_BUF pDataBuffer = NULL; 258 | 259 | UNREFERENCED_PARAMETER(DeviceObject); 260 | 261 | // Check the result of the send operation 262 | if (Irp->IoStatus.Status == STATUS_SUCCESS) { 263 | // Get the pointer to the data buffer 264 | pDataBuffer = (PWSK_BUF)Context; 265 | // Get the number of bytes sent 266 | ByteCount = (ULONG)(Irp->IoStatus.Information); 267 | 268 | // Re-use or free the data buffer 269 | } else { // Error status 270 | // Handle error 271 | } 272 | 273 | //FreeWskBuffer(pDataBuffer); 274 | 275 | // Free the IRP 276 | IoFreeIrp(Irp); 277 | 278 | // Always return STATUS_MORE_PROCESSING_REQUIRED to 279 | // terminate the completion processing of the IRP. 280 | return STATUS_MORE_PROCESSING_REQUIRED; 281 | } 282 | 283 | 284 | // Driver unload routine 285 | VOID 286 | WsktcpUnload( 287 | __in PDRIVER_OBJECT DriverObject 288 | ) 289 | { 290 | 291 | UNREFERENCED_PARAMETER(DriverObject); 292 | 293 | PAGED_CODE(); 294 | 295 | //status = DisConnect(g_TcpSocket); 296 | //if (!NT_SUCCESS(status)) { 297 | // DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "DisConnect() failed with status 0x%08X\n", status); 298 | //} 299 | 300 | if (g_TcpSocket) { 301 | CloseSocket(g_TcpSocket); 302 | g_TcpSocket = NULL; 303 | } 304 | 305 | bStopThread = TRUE; 306 | 307 | KeWaitForSingleObject(gEThread, 308 | Executive, 309 | KernelMode, 310 | FALSE, 311 | NULL); //wait for terminate thread.... 312 | 313 | 314 | 315 | ObDereferenceObject(gEThread); 316 | 317 | WSKCleanup(); 318 | 319 | ExFreePool(pRxBuf); 320 | 321 | 322 | } 323 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/wsktcp.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | 4 | Module Name: 5 | 6 | wsktcp.c 7 | 8 | Author: 9 | reinhard v.z. 10 | 11 | https://github.com/reinhardvz 12 | 13 | Environment: 14 | 15 | Kernel-Mode only 16 | 17 | Revision History: 18 | 19 | --*/ 20 | 21 | #pragma warning(push) 22 | #pragma warning(disable:4201) // nameless struct/union 23 | #pragma warning(disable:4214) // bit field types other than int 24 | 25 | #include 26 | #include 27 | #include "simplewsk.h" 28 | 29 | 30 | #pragma warning(pop) 31 | 32 | // Software Tracing definitions 33 | 34 | // Pool tags used for memory allocations 35 | #define WSKTCP_SOCKET_POOL_TAG ((ULONG)'sksw') 36 | #define WSKTCP_BUFFER_POOL_TAG ((ULONG)'bksw') 37 | #define WSKTCP_GENERIC_POOL_TAG ((ULONG)'xksw') 38 | 39 | // Default length for data buffers used in send and receive operations 40 | 41 | static PWSK_SOCKET g_TcpSocket = NULL; 42 | WSK_SOCKET* paccept_socket = NULL; 43 | PETHREAD gEThread = NULL; 44 | SOCKADDR_IN LocalAddress = { 0, }; 45 | SOCKADDR_IN RemoteAddress = { 0, }; 46 | 47 | LONG BufferSize = 0; 48 | ULONG ByteCount = 0; 49 | CHAR ServerMessage[10] = "whathehel"; 50 | CHAR* pRxBuf = NULL; 51 | BOOLEAN bStopThread = FALSE; 52 | 53 | #define SRV_PORT 40007 54 | 55 | #define HTON_SHORT(n) (((((unsigned short)(n) & 0xFFu )) << 8) | \ 56 | (((unsigned short)(n) & 0xFF00u) >> 8)) 57 | 58 | #define HTON_LONG(x) (((((x)& 0xff)<<24) | ((x)>>24) & 0xff) | \ 59 | (((x) & 0xff0000)>>8) | (((x) & 0xff00)<<8)) 60 | 61 | BOOLEAN bThreadExitDone = FALSE; 62 | 63 | NTSTATUS 64 | AsyncSendComplete( 65 | PDEVICE_OBJECT DeviceObject, 66 | PIRP Irp, 67 | PVOID Context 68 | ); 69 | 70 | VOID 71 | WsktcpUnload( 72 | __in PDRIVER_OBJECT DriverObject 73 | ); 74 | 75 | VOID 76 | TcpListenWorker( 77 | __in PVOID Context 78 | ); 79 | 80 | // Driver entry routine 81 | NTSTATUS 82 | DriverEntry( 83 | __in PDRIVER_OBJECT DriverObject, 84 | __in PUNICODE_STRING RegistryPath 85 | ) 86 | { 87 | NTSTATUS status = STATUS_SUCCESS; 88 | 89 | HANDLE hThread = NULL; 90 | UNREFERENCED_PARAMETER(RegistryPath); 91 | 92 | PAGED_CODE(); 93 | 94 | DriverObject->DriverUnload = WsktcpUnload; 95 | 96 | pRxBuf = (CHAR*)ExAllocatePoolWithTag(NonPagedPool, 10, 'dddd'); 97 | 98 | status = WSKStartup(); 99 | 100 | status = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, TcpListenWorker, NULL); 101 | if (!NT_SUCCESS(status)) { 102 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "thread Create failed with status 0x%08X\n", status); 103 | CloseSocket(g_TcpSocket); 104 | return status; 105 | } 106 | 107 | status = ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL, KernelMode, (PVOID*)&gEThread, NULL); 108 | if (NT_SUCCESS(status) == FALSE) { 109 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "ObReferenceObjectByHandle failed with status 0x%08X\n", status); 110 | CloseSocket(g_TcpSocket); 111 | return status; 112 | } 113 | ZwClose(hThread); 114 | 115 | return status; 116 | } 117 | 118 | #define ASYNC_SEND_TEST 0 119 | #define CONNECT_SEND_TEST 1 120 | ULONG ltest1 = 0; 121 | ULONG ltest2 = 0; 122 | 123 | VOID 124 | TcpListenWorker( 125 | __in PVOID Context 126 | ) 127 | { 128 | UNREFERENCED_PARAMETER(Context); 129 | 130 | NTSTATUS status = STATUS_SUCCESS; 131 | 132 | RemoteAddress.sin_family = AF_INET; 133 | //RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK); 134 | RemoteAddress.sin_addr.s_addr = 0;// HTON_LONG(0x0a0a00e8); //10.10.0.232 test 135 | RemoteAddress.sin_port = 0; 136 | 137 | #if CONNECT_SEND_TEST 138 | g_TcpSocket = CreateSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, WSK_FLAG_LISTEN_SOCKET); 139 | if (g_TcpSocket == NULL) { 140 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "CreateSocket() returned NULL\n"); 141 | goto $EXIT; 142 | } 143 | 144 | LocalAddress.sin_family = AF_INET; 145 | LocalAddress.sin_addr.s_addr = INADDR_ANY; 146 | LocalAddress.sin_port = HTON_SHORT(SRV_PORT); //40000 147 | 148 | // Bind Required 149 | status = Bind(g_TcpSocket, (PSOCKADDR)&LocalAddress); 150 | if (!NT_SUCCESS(status)) { 151 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Bind() failed with status 0x%08X\n", status); 152 | goto $EXIT; 153 | } 154 | 155 | paccept_socket = Accept(g_TcpSocket, (PSOCKADDR)&LocalAddress, (PSOCKADDR)&RemoteAddress); 156 | if (paccept_socket == NULL) { 157 | goto $EXIT; 158 | } 159 | status = GetRemoteAddress(g_TcpSocket, (PSOCKADDR)&RemoteAddress); 160 | if (status != STATUS_SUCCESS) { 161 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "GetRemoteAddress() failed with status 0x%08X\n", status); 162 | goto $EXIT; 163 | } 164 | 165 | while (!bStopThread) { 166 | 167 | if (Receive(paccept_socket, pRxBuf, 10, 0)) { 168 | if (Send(paccept_socket, ServerMessage, 10, WSK_FLAG_NODELAY) == sizeof(ServerMessage)) { 169 | //DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "send ok\n "); 170 | } 171 | else { 172 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "send error happend\n "); 173 | goto $EXIT; 174 | } 175 | } 176 | else { 177 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Receive fail\n "); 178 | goto $EXIT; 179 | } 180 | 181 | } 182 | 183 | #endif 184 | 185 | #if ASYNC_SEND_TEST 186 | g_TcpSocket = CreateSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, WSK_FLAG_CONNECTION_SOCKET); 187 | if (g_TcpSocket == NULL) { 188 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "CreateSocket() returned NULL\n"); 189 | goto $EXIT; 190 | } 191 | 192 | LocalAddress.sin_family = AF_INET; 193 | LocalAddress.sin_addr.s_addr = INADDR_ANY; 194 | 195 | // Bind Required 196 | status = Bind(g_TcpSocket, (PSOCKADDR)&LocalAddress); 197 | if (!NT_SUCCESS(status)) { 198 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Bind() failed with status 0x%08X\n", status); 199 | goto $EXIT; 200 | } 201 | 202 | status = Connect(g_TcpSocket, (PSOCKADDR)&RemoteAddress); 203 | if (!NT_SUCCESS(status)) { 204 | DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "Connect() failed with status 0x%08X\n", status); 205 | goto $EXIT; 206 | } 207 | 208 | 209 | InitWskBuffer(GreetMessage, sizeof(GreetMessage) - 1, &WskBuffer); 210 | 211 | while (!bStopThread) { 212 | PIRP Irp; 213 | 214 | 215 | interval.QuadPart = (-1 * 1000 * 1000 * 10); // wait 1 sec relative 216 | 217 | KeDelayExecutionThread(KernelMode, TRUE, &interval); 218 | // Allocate an IRP 219 | Irp = IoAllocateIrp( 1, FALSE ); 220 | // Check result 221 | if (!Irp) { 222 | goto $EXIT; 223 | } 224 | 225 | // Set the completion routine for the IRP 226 | IoSetCompletionRoutine(Irp, AsyncSendComplete , &WskBuffer, TRUE, TRUE, TRUE); 227 | 228 | //g_TcpSocket->Dispatch->WskSend(g_TcpSocket, WskBuffer, 0, Irp); 229 | ((PWSK_PROVIDER_CONNECTION_DISPATCH)g_TcpSocket->Dispatch)->WskSend(g_TcpSocket, &WskBuffer, 0, Irp); 230 | 231 | } 232 | 233 | 234 | 235 | #endif 236 | 237 | $EXIT: 238 | 239 | if (g_TcpSocket) { 240 | CloseSocket(g_TcpSocket); 241 | g_TcpSocket = NULL; 242 | } 243 | if (paccept_socket) { 244 | CloseSocket(paccept_socket); 245 | paccept_socket = NULL; 246 | } 247 | 248 | PsTerminateSystemThread(STATUS_SUCCESS); 249 | 250 | return; 251 | } 252 | 253 | NTSTATUS 254 | AsyncSendComplete( 255 | PDEVICE_OBJECT DeviceObject, 256 | PIRP Irp, 257 | PVOID Context 258 | ) 259 | { 260 | 261 | PWSK_BUF pDataBuffer = NULL; 262 | 263 | UNREFERENCED_PARAMETER(DeviceObject); 264 | 265 | // Check the result of the send operation 266 | if (Irp->IoStatus.Status == STATUS_SUCCESS) { 267 | // Get the pointer to the data buffer 268 | pDataBuffer = (PWSK_BUF)Context; 269 | // Get the number of bytes sent 270 | ByteCount = (ULONG)(Irp->IoStatus.Information); 271 | 272 | // Re-use or free the data buffer 273 | } else { // Error status 274 | // Handle error 275 | } 276 | 277 | //FreeWskBuffer(pDataBuffer); 278 | 279 | // Free the IRP 280 | IoFreeIrp(Irp); 281 | 282 | // Always return STATUS_MORE_PROCESSING_REQUIRED to 283 | // terminate the completion processing of the IRP. 284 | return STATUS_MORE_PROCESSING_REQUIRED; 285 | } 286 | 287 | 288 | // Driver unload routine 289 | VOID 290 | WsktcpUnload( 291 | __in PDRIVER_OBJECT DriverObject 292 | ) 293 | { 294 | 295 | UNREFERENCED_PARAMETER(DriverObject); 296 | 297 | PAGED_CODE(); 298 | 299 | 300 | //status = DisConnect(g_TcpSocket); 301 | //if (!NT_SUCCESS(status)) { 302 | // DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "DisConnect() failed with status 0x%08X\n", status); 303 | //} 304 | //status = DisConnect(paccept_socket); 305 | //if (!NT_SUCCESS(status)) { 306 | // DbgPrintEx(DPFLTR_IHVNETWORK_ID, 0xFFFFFFFF, "DisConnect() failed with status 0x%08X\n", status); 307 | //} 308 | 309 | if (g_TcpSocket) { 310 | CloseSocket(g_TcpSocket); 311 | g_TcpSocket = NULL; 312 | } 313 | if (paccept_socket) { 314 | CloseSocket(paccept_socket); 315 | paccept_socket = NULL; 316 | } 317 | 318 | bStopThread = TRUE; 319 | 320 | KeWaitForSingleObject(gEThread, 321 | Executive, 322 | KernelMode, 323 | FALSE, 324 | NULL); //wait for terminate thread.... 325 | ObDereferenceObject(gEThread); 326 | 327 | WSKCleanup(); 328 | 329 | ExFreePool(pRxBuf); 330 | 331 | } 332 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli Package/wsktcpcli Package.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Win8.1 Debug 6 | Win32 7 | 8 | 9 | Win8.1 Release 10 | Win32 11 | 12 | 13 | Win8 Debug 14 | Win32 15 | 16 | 17 | Win8 Release 18 | Win32 19 | 20 | 21 | Win7 Debug 22 | Win32 23 | 24 | 25 | Win7 Release 26 | Win32 27 | 28 | 29 | Win8.1 Debug 30 | x64 31 | 32 | 33 | Win8.1 Release 34 | x64 35 | 36 | 37 | Win8 Debug 38 | x64 39 | 40 | 41 | Win8 Release 42 | x64 43 | 44 | 45 | Win7 Debug 46 | x64 47 | 48 | 49 | Win7 Release 50 | x64 51 | 52 | 53 | 54 | {CCDA46AD-9AD1-48B8-8E5F-6D0C015EC15D} 55 | {4605da2c-74a5-4865-98e1-152ef136825f} 56 | v4.5 57 | 11.0 58 | Win8.1 Debug 59 | Win32 60 | wsktcpcli_Package 61 | 62 | 63 | 64 | WindowsV6.3 65 | true 66 | WindowsKernelModeDriver8.1 67 | Utility 68 | Package 69 | true 70 | 71 | 72 | WindowsV6.3 73 | false 74 | WindowsKernelModeDriver8.1 75 | Utility 76 | Package 77 | true 78 | 79 | 80 | Windows8 81 | true 82 | WindowsKernelModeDriver8.1 83 | Utility 84 | Package 85 | true 86 | 87 | 88 | Windows8 89 | false 90 | WindowsKernelModeDriver8.1 91 | Utility 92 | Package 93 | true 94 | 95 | 96 | Windows7 97 | true 98 | WindowsKernelModeDriver8.1 99 | Utility 100 | Package 101 | true 102 | 103 | 104 | Windows7 105 | false 106 | WindowsKernelModeDriver8.1 107 | Utility 108 | Package 109 | true 110 | 111 | 112 | WindowsV6.3 113 | true 114 | WindowsKernelModeDriver8.1 115 | Utility 116 | Package 117 | true 118 | 119 | 120 | WindowsV6.3 121 | false 122 | WindowsKernelModeDriver8.1 123 | Utility 124 | Package 125 | true 126 | 127 | 128 | Windows8 129 | true 130 | WindowsKernelModeDriver8.1 131 | Utility 132 | Package 133 | true 134 | 135 | 136 | Windows8 137 | false 138 | WindowsKernelModeDriver8.1 139 | Utility 140 | Package 141 | true 142 | 143 | 144 | Windows7 145 | true 146 | WindowsKernelModeDriver8.1 147 | Utility 148 | Package 149 | true 150 | 151 | 152 | Windows7 153 | false 154 | WindowsKernelModeDriver8.1 155 | Utility 156 | Package 157 | true 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | DbgengKernelDebugger 169 | False 170 | True 171 | 172 | 173 | 174 | False 175 | False 176 | True 177 | 178 | 133563 179 | 180 | 181 | DbgengKernelDebugger 182 | False 183 | True 184 | 185 | 186 | 187 | False 188 | False 189 | True 190 | 191 | 133563 192 | 193 | 194 | DbgengKernelDebugger 195 | False 196 | True 197 | 198 | 199 | 200 | False 201 | False 202 | True 203 | 204 | 133563 205 | 206 | 207 | DbgengKernelDebugger 208 | False 209 | True 210 | 211 | 212 | 213 | False 214 | False 215 | True 216 | 217 | 133563 218 | 219 | 220 | DbgengKernelDebugger 221 | False 222 | True 223 | 224 | 225 | 226 | False 227 | False 228 | True 229 | 230 | 133563 231 | 232 | 233 | DbgengKernelDebugger 234 | False 235 | True 236 | 237 | 238 | 239 | False 240 | False 241 | True 242 | 243 | 133563 244 | 245 | 246 | DbgengKernelDebugger 247 | False 248 | True 249 | 250 | 251 | 252 | False 253 | False 254 | True 255 | 256 | 133563 257 | 258 | 259 | DbgengKernelDebugger 260 | False 261 | True 262 | 263 | 264 | 265 | False 266 | False 267 | True 268 | 269 | 133563 270 | 271 | 272 | DbgengKernelDebugger 273 | False 274 | True 275 | 276 | 277 | 278 | False 279 | False 280 | True 281 | 282 | 133563 283 | 284 | 285 | DbgengKernelDebugger 286 | False 287 | True 288 | 289 | 290 | 291 | False 292 | False 293 | True 294 | 295 | 133563 296 | 297 | 298 | DbgengKernelDebugger 299 | False 300 | True 301 | 302 | 303 | 304 | False 305 | False 306 | True 307 | 308 | 133563 309 | 310 | 311 | DbgengKernelDebugger 312 | False 313 | True 314 | 315 | 316 | 317 | False 318 | False 319 | True 320 | 321 | 133563 322 | 323 | 324 | 325 | 326 | 327 | 328 | {ad3b03ac-5cbb-4684-84a2-aa940eeef935} 329 | 330 | 331 | 332 | 333 | 334 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv Package/wsktcpsrv Package.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Win8.1 Debug 6 | Win32 7 | 8 | 9 | Win8.1 Release 10 | Win32 11 | 12 | 13 | Win8 Debug 14 | Win32 15 | 16 | 17 | Win8 Release 18 | Win32 19 | 20 | 21 | Win7 Debug 22 | Win32 23 | 24 | 25 | Win7 Release 26 | Win32 27 | 28 | 29 | Win8.1 Debug 30 | x64 31 | 32 | 33 | Win8.1 Release 34 | x64 35 | 36 | 37 | Win8 Debug 38 | x64 39 | 40 | 41 | Win8 Release 42 | x64 43 | 44 | 45 | Win7 Debug 46 | x64 47 | 48 | 49 | Win7 Release 50 | x64 51 | 52 | 53 | 54 | {7F4457B1-9719-414C-8B09-6388181B25C4} 55 | {4605da2c-74a5-4865-98e1-152ef136825f} 56 | v4.5 57 | 11.0 58 | Win8.1 Debug 59 | Win32 60 | wsktcpsrv_Package 61 | 62 | 63 | 64 | WindowsV6.3 65 | true 66 | WindowsKernelModeDriver8.1 67 | Utility 68 | Package 69 | true 70 | 71 | 72 | WindowsV6.3 73 | false 74 | WindowsKernelModeDriver8.1 75 | Utility 76 | Package 77 | true 78 | 79 | 80 | Windows8 81 | true 82 | WindowsKernelModeDriver8.1 83 | Utility 84 | Package 85 | true 86 | 87 | 88 | Windows8 89 | false 90 | WindowsKernelModeDriver8.1 91 | Utility 92 | Package 93 | true 94 | 95 | 96 | Windows7 97 | true 98 | WindowsKernelModeDriver8.1 99 | Utility 100 | Package 101 | true 102 | 103 | 104 | Windows7 105 | false 106 | WindowsKernelModeDriver8.1 107 | Utility 108 | Package 109 | true 110 | 111 | 112 | WindowsV6.3 113 | true 114 | WindowsKernelModeDriver8.1 115 | Utility 116 | Package 117 | true 118 | 119 | 120 | WindowsV6.3 121 | false 122 | WindowsKernelModeDriver8.1 123 | Utility 124 | Package 125 | true 126 | 127 | 128 | Windows8 129 | true 130 | WindowsKernelModeDriver8.1 131 | Utility 132 | Package 133 | true 134 | 135 | 136 | Windows8 137 | false 138 | WindowsKernelModeDriver8.1 139 | Utility 140 | Package 141 | true 142 | 143 | 144 | Windows7 145 | true 146 | WindowsKernelModeDriver8.1 147 | Utility 148 | Package 149 | true 150 | 151 | 152 | Windows7 153 | false 154 | WindowsKernelModeDriver8.1 155 | Utility 156 | Package 157 | true 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | DbgengKernelDebugger 169 | False 170 | True 171 | 172 | 173 | 174 | False 175 | False 176 | True 177 | 178 | 133563 179 | 180 | 181 | DbgengKernelDebugger 182 | False 183 | True 184 | 185 | 186 | 187 | False 188 | False 189 | True 190 | 191 | 133563 192 | 193 | 194 | DbgengKernelDebugger 195 | False 196 | True 197 | 198 | 199 | 200 | False 201 | False 202 | True 203 | 204 | 133563 205 | 206 | 207 | DbgengKernelDebugger 208 | False 209 | True 210 | 211 | 212 | 213 | False 214 | False 215 | True 216 | 217 | 133563 218 | 219 | 220 | DbgengKernelDebugger 221 | False 222 | True 223 | 224 | 225 | 226 | False 227 | False 228 | True 229 | 230 | 133563 231 | 232 | 233 | DbgengKernelDebugger 234 | False 235 | True 236 | 237 | 238 | 239 | False 240 | False 241 | True 242 | 243 | 133563 244 | 245 | 246 | DbgengKernelDebugger 247 | False 248 | True 249 | 250 | 251 | 252 | False 253 | False 254 | True 255 | 256 | 133563 257 | 258 | 259 | DbgengKernelDebugger 260 | False 261 | True 262 | 263 | 264 | 265 | False 266 | False 267 | True 268 | 269 | 133563 270 | 271 | 272 | DbgengKernelDebugger 273 | False 274 | True 275 | 276 | 277 | 278 | False 279 | False 280 | True 281 | 282 | 133563 283 | 284 | 285 | DbgengKernelDebugger 286 | False 287 | True 288 | 289 | 290 | 291 | False 292 | False 293 | True 294 | 295 | 133563 296 | 297 | 298 | DbgengKernelDebugger 299 | False 300 | True 301 | 302 | 303 | 304 | False 305 | False 306 | True 307 | 308 | 133563 309 | 310 | 311 | DbgengKernelDebugger 312 | False 313 | True 314 | 315 | 316 | 317 | False 318 | False 319 | True 320 | 321 | 133563 322 | 323 | 324 | 325 | 326 | 327 | 328 | {11747f5b-b1c1-4763-b5d6-a62c7da3944c} 329 | 330 | 331 | 332 | 333 | 334 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/wsktcpcli.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Win8.1 Debug 6 | Win32 7 | 8 | 9 | Win8.1 Release 10 | Win32 11 | 12 | 13 | Win8 Debug 14 | Win32 15 | 16 | 17 | Win8 Release 18 | Win32 19 | 20 | 21 | Win7 Debug 22 | Win32 23 | 24 | 25 | Win7 Release 26 | Win32 27 | 28 | 29 | Win8.1 Debug 30 | x64 31 | 32 | 33 | Win8.1 Release 34 | x64 35 | 36 | 37 | Win8 Debug 38 | x64 39 | 40 | 41 | Win8 Release 42 | x64 43 | 44 | 45 | Win7 Debug 46 | x64 47 | 48 | 49 | Win7 Release 50 | x64 51 | 52 | 53 | 54 | {AD3B03AC-5CBB-4684-84A2-AA940EEEF935} 55 | {dd38f7fc-d7bd-488b-9242-7d8754cde80d} 56 | v4.5 57 | 11.0 58 | Win8.1 Debug 59 | Win32 60 | wsktcpcli 61 | 62 | 63 | 64 | WindowsV6.3 65 | true 66 | WindowsKernelModeDriver8.1 67 | Driver 68 | WDM 69 | 70 | 71 | WindowsV6.3 72 | false 73 | WindowsKernelModeDriver8.1 74 | Driver 75 | WDM 76 | 77 | 78 | Windows8 79 | true 80 | WindowsKernelModeDriver8.1 81 | Driver 82 | WDM 83 | 84 | 85 | Windows8 86 | false 87 | WindowsKernelModeDriver8.1 88 | Driver 89 | WDM 90 | 91 | 92 | Windows7 93 | true 94 | WindowsKernelModeDriver8.1 95 | Driver 96 | WDM 97 | 98 | 99 | Windows7 100 | false 101 | WindowsKernelModeDriver8.1 102 | Driver 103 | WDM 104 | 105 | 106 | WindowsV6.3 107 | true 108 | WindowsKernelModeDriver8.1 109 | Driver 110 | WDM 111 | 112 | 113 | WindowsV6.3 114 | false 115 | WindowsKernelModeDriver8.1 116 | Driver 117 | WDM 118 | 119 | 120 | Windows8 121 | true 122 | WindowsKernelModeDriver8.1 123 | Driver 124 | WDM 125 | 126 | 127 | Windows8 128 | false 129 | WindowsKernelModeDriver8.1 130 | Driver 131 | WDM 132 | 133 | 134 | Windows7 135 | true 136 | WindowsKernelModeDriver8.1 137 | Driver 138 | WDM 139 | 140 | 141 | Windows7 142 | false 143 | WindowsKernelModeDriver8.1 144 | Driver 145 | WDM 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | DbgengKernelDebugger 157 | 158 | 159 | DbgengKernelDebugger 160 | 161 | 162 | DbgengKernelDebugger 163 | 164 | 165 | DbgengKernelDebugger 166 | 167 | 168 | DbgengKernelDebugger 169 | 170 | 171 | DbgengKernelDebugger 172 | 173 | 174 | DbgengKernelDebugger 175 | 176 | 177 | DbgengKernelDebugger 178 | 179 | 180 | DbgengKernelDebugger 181 | 182 | 183 | DbgengKernelDebugger 184 | 185 | 186 | DbgengKernelDebugger 187 | 188 | 189 | DbgengKernelDebugger 190 | 191 | 192 | 193 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 194 | 195 | 196 | Disabled 197 | 198 | 199 | false 200 | 201 | 202 | 203 | 204 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 205 | 206 | 207 | Disabled 208 | 209 | 210 | false 211 | 212 | 213 | 214 | 215 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 216 | 217 | 218 | Disabled 219 | 220 | 221 | Disabled 222 | 223 | 224 | Neither 225 | 226 | 227 | 228 | 229 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 230 | 231 | 232 | Disabled 233 | 234 | 235 | false 236 | 237 | 238 | 239 | 240 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 241 | 242 | 243 | Disabled 244 | 245 | 246 | Disabled 247 | 248 | 249 | Neither 250 | 251 | 252 | 253 | 254 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 255 | 256 | 257 | Disabled 258 | 259 | 260 | Disabled 261 | 262 | 263 | Neither 264 | 265 | 266 | 267 | 268 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 269 | 270 | 271 | Disabled 272 | 273 | 274 | false 275 | 276 | 277 | 278 | 279 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 280 | 281 | 282 | Disabled 283 | 284 | 285 | false 286 | 287 | 288 | 289 | 290 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 291 | 292 | 293 | Disabled 294 | 295 | 296 | Disabled 297 | 298 | 299 | Neither 300 | 301 | 302 | 303 | 304 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 305 | 306 | 307 | Disabled 308 | 309 | 310 | false 311 | 312 | 313 | 314 | 315 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 316 | 317 | 318 | Disabled 319 | 320 | 321 | Disabled 322 | 323 | 324 | Neither 325 | 326 | 327 | 328 | 329 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 330 | 331 | 332 | Disabled 333 | 334 | 335 | Disabled 336 | 337 | 338 | Neither 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/wsktcpsrv.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Win8.1 Debug 6 | Win32 7 | 8 | 9 | Win8.1 Release 10 | Win32 11 | 12 | 13 | Win8 Debug 14 | Win32 15 | 16 | 17 | Win8 Release 18 | Win32 19 | 20 | 21 | Win7 Debug 22 | Win32 23 | 24 | 25 | Win7 Release 26 | Win32 27 | 28 | 29 | Win8.1 Debug 30 | x64 31 | 32 | 33 | Win8.1 Release 34 | x64 35 | 36 | 37 | Win8 Debug 38 | x64 39 | 40 | 41 | Win8 Release 42 | x64 43 | 44 | 45 | Win7 Debug 46 | x64 47 | 48 | 49 | Win7 Release 50 | x64 51 | 52 | 53 | 54 | {11747F5B-B1C1-4763-B5D6-A62C7DA3944C} 55 | {dd38f7fc-d7bd-488b-9242-7d8754cde80d} 56 | v4.5 57 | 11.0 58 | Win8.1 Debug 59 | Win32 60 | wsktcpsrv 61 | 62 | 63 | 64 | WindowsV6.3 65 | true 66 | WindowsKernelModeDriver8.1 67 | Driver 68 | WDM 69 | 70 | 71 | WindowsV6.3 72 | false 73 | WindowsKernelModeDriver8.1 74 | Driver 75 | WDM 76 | 77 | 78 | Windows8 79 | true 80 | WindowsKernelModeDriver8.1 81 | Driver 82 | WDM 83 | 84 | 85 | Windows8 86 | false 87 | WindowsKernelModeDriver8.1 88 | Driver 89 | WDM 90 | 91 | 92 | Windows7 93 | true 94 | WindowsKernelModeDriver8.1 95 | Driver 96 | WDM 97 | 98 | 99 | Windows7 100 | false 101 | WindowsKernelModeDriver8.1 102 | Driver 103 | WDM 104 | 105 | 106 | WindowsV6.3 107 | true 108 | WindowsKernelModeDriver8.1 109 | Driver 110 | WDM 111 | 112 | 113 | WindowsV6.3 114 | false 115 | WindowsKernelModeDriver8.1 116 | Driver 117 | WDM 118 | 119 | 120 | Windows8 121 | true 122 | WindowsKernelModeDriver8.1 123 | Driver 124 | WDM 125 | 126 | 127 | Windows8 128 | false 129 | WindowsKernelModeDriver8.1 130 | Driver 131 | WDM 132 | 133 | 134 | Windows7 135 | true 136 | WindowsKernelModeDriver8.1 137 | Driver 138 | WDM 139 | 140 | 141 | Windows7 142 | false 143 | WindowsKernelModeDriver8.1 144 | Driver 145 | WDM 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | DbgengKernelDebugger 157 | 158 | 159 | DbgengKernelDebugger 160 | 161 | 162 | DbgengKernelDebugger 163 | 164 | 165 | DbgengKernelDebugger 166 | 167 | 168 | DbgengKernelDebugger 169 | 170 | 171 | DbgengKernelDebugger 172 | 173 | 174 | DbgengKernelDebugger 175 | 176 | 177 | DbgengKernelDebugger 178 | 179 | 180 | DbgengKernelDebugger 181 | 182 | 183 | DbgengKernelDebugger 184 | 185 | 186 | DbgengKernelDebugger 187 | 188 | 189 | DbgengKernelDebugger 190 | 191 | 192 | 193 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 194 | 195 | 196 | Disabled 197 | 198 | 199 | Disabled 200 | 201 | 202 | Neither 203 | 204 | 205 | 206 | 207 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 208 | 209 | 210 | Disabled 211 | 212 | 213 | Disabled 214 | 215 | 216 | Neither 217 | 218 | 219 | 220 | 221 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 222 | 223 | 224 | Disabled 225 | 226 | 227 | false 228 | 229 | 230 | 231 | 232 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 233 | 234 | 235 | Disabled 236 | 237 | 238 | false 239 | 240 | 241 | 242 | 243 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 244 | 245 | 246 | Disabled 247 | 248 | 249 | false 250 | 251 | 252 | 253 | 254 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 255 | 256 | 257 | Disabled 258 | 259 | 260 | Disabled 261 | 262 | 263 | Neither 264 | 265 | 266 | 267 | 268 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 269 | 270 | 271 | Disabled 272 | 273 | 274 | Disabled 275 | 276 | 277 | Neither 278 | 279 | 280 | 281 | 282 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 283 | 284 | 285 | Disabled 286 | 287 | 288 | false 289 | 290 | 291 | 292 | 293 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 294 | 295 | 296 | Disabled 297 | 298 | 299 | false 300 | 301 | 302 | 303 | 304 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 305 | 306 | 307 | Disabled 308 | 309 | 310 | false 311 | 312 | 313 | 314 | 315 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 316 | 317 | 318 | Disabled 319 | 320 | 321 | Disabled 322 | 323 | 324 | Neither 325 | 326 | 327 | 328 | 329 | $(DDK_LIB_PATH)\netio.lib;%(AdditionalDependencies) 330 | 331 | 332 | Disabled 333 | 334 | 335 | Disabled 336 | 337 | 338 | Neither 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | -------------------------------------------------------------------------------- /wskudp/simplewsk.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | Module Name: 4 | 5 | simplewsk.c 6 | 7 | Abstract: 8 | 9 | Wrapper library for WSK functions 10 | 11 | Author: 12 | 13 | MaD, 12-May-2009 14 | 15 | --*/ 16 | 17 | #include "simplewsk.h" 18 | 19 | 20 | static WSK_REGISTRATION g_WskRegistration; 21 | static WSK_PROVIDER_NPI g_WskProvider; 22 | static WSK_CLIENT_DISPATCH g_WskDispatch = {MAKE_WSK_VERSION(1,0), 0, NULL}; 23 | 24 | enum 25 | { 26 | DEINITIALIZED, 27 | DEINITIALIZING, 28 | INITIALIZING, 29 | INITIALIZED 30 | }; 31 | 32 | static LONG g_SocketsState = DEINITIALIZED; 33 | 34 | 35 | 36 | 37 | 38 | static 39 | NTSTATUS 40 | NTAPI 41 | CompletionRoutine( 42 | __in PDEVICE_OBJECT DeviceObject, 43 | __in PIRP Irp, 44 | __in PKEVENT CompletionEvent 45 | ) 46 | { 47 | ASSERT( CompletionEvent ); 48 | 49 | UNREFERENCED_PARAMETER(Irp); 50 | UNREFERENCED_PARAMETER(DeviceObject); 51 | 52 | KeSetEvent(CompletionEvent, IO_NO_INCREMENT, FALSE); 53 | return STATUS_MORE_PROCESSING_REQUIRED; 54 | } 55 | 56 | static 57 | NTSTATUS 58 | InitWskData( 59 | __out PIRP* pIrp, 60 | __out PKEVENT CompletionEvent 61 | ) 62 | { 63 | ASSERT( pIrp ); 64 | ASSERT( CompletionEvent ); 65 | 66 | *pIrp = IoAllocateIrp(1, FALSE); 67 | if (!*pIrp) { 68 | KdPrint(("InitWskData(): IoAllocateIrp() failed\n")); 69 | return STATUS_INSUFFICIENT_RESOURCES; 70 | } 71 | 72 | KeInitializeEvent(CompletionEvent, SynchronizationEvent, FALSE); 73 | IoSetCompletionRoutine(*pIrp, CompletionRoutine, CompletionEvent, TRUE, TRUE, TRUE); 74 | return STATUS_SUCCESS; 75 | } 76 | 77 | static 78 | NTSTATUS 79 | InitWskBuffer( 80 | __in PVOID Buffer, 81 | __in ULONG BufferSize, 82 | __out PWSK_BUF WskBuffer 83 | ) 84 | { 85 | NTSTATUS Status = STATUS_SUCCESS; 86 | 87 | ASSERT( Buffer ); 88 | ASSERT( BufferSize ); 89 | ASSERT( WskBuffer ); 90 | 91 | WskBuffer->Offset = 0; 92 | WskBuffer->Length = BufferSize; 93 | 94 | WskBuffer->Mdl = IoAllocateMdl(Buffer, BufferSize, FALSE, FALSE, NULL); 95 | if (!WskBuffer->Mdl) { 96 | KdPrint(("InitWskBuffer(): IoAllocateMdl() failed\n")); 97 | return STATUS_INSUFFICIENT_RESOURCES; 98 | } 99 | 100 | __try { 101 | MmProbeAndLockPages(WskBuffer->Mdl, KernelMode, IoWriteAccess); 102 | } 103 | __except(EXCEPTION_EXECUTE_HANDLER) { 104 | KdPrint(("InitWskBuffer(): MmProbeAndLockPages(%p) failed\n", Buffer)); 105 | IoFreeMdl(WskBuffer->Mdl); 106 | Status = STATUS_ACCESS_VIOLATION; 107 | } 108 | 109 | return Status; 110 | } 111 | 112 | static 113 | VOID 114 | FreeWskBuffer( 115 | __in PWSK_BUF WskBuffer 116 | ) 117 | { 118 | ASSERT( WskBuffer ); 119 | 120 | 121 | MmUnlockPages(WskBuffer->Mdl); 122 | IoFreeMdl(WskBuffer->Mdl); 123 | } 124 | 125 | // 126 | // Library initialization routine 127 | // 128 | 129 | NTSTATUS NTAPI WSKStartup() 130 | { 131 | WSK_CLIENT_NPI WskClient = {0}; 132 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 133 | 134 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZING, DEINITIALIZED) != DEINITIALIZED) 135 | return STATUS_ALREADY_REGISTERED; 136 | 137 | WskClient.ClientContext = NULL; 138 | WskClient.Dispatch = &g_WskDispatch; 139 | 140 | Status = WskRegister(&WskClient, &g_WskRegistration); 141 | if (!NT_SUCCESS(Status)) { 142 | KdPrint(("WskRegister() failed with status 0x%08X\n", Status)); 143 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 144 | return Status; 145 | } 146 | 147 | Status = WskCaptureProviderNPI(&g_WskRegistration, WSK_NO_WAIT, &g_WskProvider); 148 | if (!NT_SUCCESS(Status)) { 149 | KdPrint(("WskCaptureProviderNPI() failed with status 0x%08X\n", Status)); 150 | WskDeregister(&g_WskRegistration); 151 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 152 | return Status; 153 | } 154 | 155 | InterlockedExchange(&g_SocketsState, INITIALIZED); 156 | return STATUS_SUCCESS; 157 | } 158 | 159 | // 160 | // Library deinitialization routine 161 | // 162 | 163 | VOID NTAPI WSKCleanup() 164 | { 165 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZED, DEINITIALIZING) != INITIALIZED) 166 | return; 167 | 168 | WskReleaseProviderNPI(&g_WskRegistration); 169 | WskDeregister(&g_WskRegistration); 170 | 171 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 172 | } 173 | 174 | 175 | 176 | PWSK_SOCKET 177 | NTAPI 178 | CreateSocket( 179 | __in ADDRESS_FAMILY AddressFamily, 180 | __in USHORT SocketType, 181 | __in ULONG Protocol, 182 | __in ULONG Flags 183 | ) 184 | { 185 | KEVENT CompletionEvent = {0}; 186 | PIRP Irp = NULL; 187 | PWSK_SOCKET WskSocket = NULL; 188 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 189 | 190 | if (g_SocketsState != INITIALIZED) 191 | return NULL; 192 | 193 | Status = InitWskData(&Irp, &CompletionEvent); 194 | if (!NT_SUCCESS(Status)) { 195 | KdPrint(("CreateSocket(): InitWskData() failed with status 0x%08X\n", Status)); 196 | return NULL; 197 | } 198 | 199 | Status = g_WskProvider.Dispatch->WskSocket( 200 | g_WskProvider.Client, 201 | AddressFamily, 202 | SocketType, 203 | Protocol, 204 | Flags, 205 | NULL, 206 | NULL, 207 | NULL, 208 | NULL, 209 | NULL, 210 | Irp); 211 | if (Status == STATUS_PENDING) { 212 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 213 | Status = Irp->IoStatus.Status; 214 | } 215 | 216 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 217 | 218 | IoFreeIrp(Irp); 219 | return (PWSK_SOCKET)WskSocket; 220 | } 221 | 222 | NTSTATUS 223 | NTAPI 224 | CloseSocket( 225 | __in PWSK_SOCKET WskSocket 226 | ) 227 | { 228 | KEVENT CompletionEvent = {0}; 229 | PIRP Irp = NULL; 230 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 231 | 232 | if (g_SocketsState != INITIALIZED || !WskSocket) 233 | return STATUS_INVALID_PARAMETER; 234 | 235 | Status = InitWskData(&Irp, &CompletionEvent); 236 | if (!NT_SUCCESS(Status)) { 237 | KdPrint(("CloseSocket(): InitWskData() failed with status 0x%08X\n", Status)); 238 | return Status; 239 | } 240 | 241 | Status = ((PWSK_PROVIDER_BASIC_DISPATCH)WskSocket->Dispatch)->WskCloseSocket(WskSocket, Irp); 242 | if (Status == STATUS_PENDING) { 243 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 244 | Status = Irp->IoStatus.Status; 245 | } 246 | 247 | IoFreeIrp(Irp); 248 | return Status; 249 | } 250 | 251 | 252 | NTSTATUS 253 | NTAPI 254 | Connect( 255 | __in PWSK_SOCKET WskSocket, 256 | __in PSOCKADDR RemoteAddress 257 | ) 258 | { 259 | KEVENT CompletionEvent = {0}; 260 | PIRP Irp = NULL; 261 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 262 | 263 | if (g_SocketsState != INITIALIZED || !WskSocket || !RemoteAddress) 264 | return STATUS_INVALID_PARAMETER; 265 | 266 | Status = InitWskData(&Irp, &CompletionEvent); 267 | if (!NT_SUCCESS(Status)) { 268 | KdPrint(("Connect(): InitWskData() failed with status 0x%08X\n", Status)); 269 | return Status; 270 | } 271 | 272 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskConnect( 273 | WskSocket, 274 | RemoteAddress, 275 | 0, 276 | Irp); 277 | if (Status == STATUS_PENDING) { 278 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 279 | Status = Irp->IoStatus.Status; 280 | } 281 | 282 | IoFreeIrp(Irp); 283 | return Status; 284 | } 285 | 286 | PWSK_SOCKET 287 | NTAPI 288 | SocketConnect( 289 | __in USHORT SocketType, 290 | __in ULONG Protocol, 291 | __in PSOCKADDR RemoteAddress, 292 | __in PSOCKADDR LocalAddress 293 | ) 294 | { 295 | KEVENT CompletionEvent = {0}; 296 | PIRP Irp = NULL; 297 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 298 | PWSK_SOCKET WskSocket = NULL; 299 | 300 | if (g_SocketsState != INITIALIZED || !RemoteAddress || !LocalAddress) 301 | return NULL; 302 | 303 | Status = InitWskData(&Irp, &CompletionEvent); 304 | if (!NT_SUCCESS(Status)) { 305 | KdPrint(("InitWskData() failed with status 0x%08X\n", Status)); 306 | return NULL; 307 | } 308 | 309 | Status = g_WskProvider.Dispatch->WskSocketConnect( 310 | g_WskProvider.Client, 311 | SocketType, 312 | Protocol, 313 | LocalAddress, 314 | RemoteAddress, 315 | 0, 316 | NULL, 317 | NULL, 318 | NULL, 319 | NULL, 320 | NULL, 321 | Irp); 322 | if (Status == STATUS_PENDING) { 323 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 324 | Status = Irp->IoStatus.Status; 325 | } 326 | 327 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 328 | 329 | IoFreeIrp(Irp); 330 | return WskSocket; 331 | } 332 | 333 | 334 | LONG 335 | NTAPI 336 | Send( 337 | __in PWSK_SOCKET WskSocket, 338 | __in PVOID Buffer, 339 | __in ULONG BufferSize, 340 | __in ULONG Flags 341 | ) 342 | { 343 | KEVENT CompletionEvent = {0}; 344 | PIRP Irp = NULL; 345 | WSK_BUF WskBuffer = {0}; 346 | LONG BytesSent = SOCKET_ERROR; 347 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 348 | 349 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 350 | return SOCKET_ERROR; 351 | 352 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 353 | if (!NT_SUCCESS(Status)) { 354 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 355 | return SOCKET_ERROR; 356 | } 357 | 358 | Status = InitWskData(&Irp, &CompletionEvent); 359 | if (!NT_SUCCESS(Status)) { 360 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 361 | FreeWskBuffer(&WskBuffer); 362 | return SOCKET_ERROR; 363 | } 364 | 365 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskSend( 366 | WskSocket, 367 | &WskBuffer, 368 | Flags, 369 | Irp); 370 | if (Status == STATUS_PENDING) { 371 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 372 | Status = Irp->IoStatus.Status; 373 | } 374 | 375 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 376 | 377 | IoFreeIrp(Irp); 378 | FreeWskBuffer(&WskBuffer); 379 | return BytesSent; 380 | } 381 | 382 | LONG 383 | NTAPI 384 | SendTo( 385 | __in PWSK_SOCKET WskSocket, 386 | __in PVOID Buffer, 387 | __in ULONG BufferSize, 388 | __in_opt PSOCKADDR RemoteAddress 389 | ) 390 | { 391 | KEVENT CompletionEvent = {0}; 392 | PIRP Irp = NULL; 393 | WSK_BUF WskBuffer = {0}; 394 | LONG BytesSent = SOCKET_ERROR; 395 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 396 | 397 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 398 | return SOCKET_ERROR; 399 | 400 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 401 | if (!NT_SUCCESS(Status)) { 402 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 403 | return SOCKET_ERROR; 404 | } 405 | 406 | Status = InitWskData(&Irp, &CompletionEvent); 407 | if (!NT_SUCCESS(Status)) { 408 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 409 | FreeWskBuffer(&WskBuffer); 410 | return SOCKET_ERROR; 411 | } 412 | 413 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskSendTo( 414 | WskSocket, 415 | &WskBuffer, 416 | 0, 417 | RemoteAddress, 418 | 0, 419 | NULL, 420 | Irp); 421 | if (Status == STATUS_PENDING) { 422 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 423 | Status = Irp->IoStatus.Status; 424 | } 425 | 426 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 427 | 428 | IoFreeIrp(Irp); 429 | FreeWskBuffer(&WskBuffer); 430 | return BytesSent; 431 | } 432 | 433 | LONG 434 | NTAPI 435 | Receive( 436 | __in PWSK_SOCKET WskSocket, 437 | __out PVOID Buffer, 438 | __in ULONG BufferSize, 439 | __in ULONG Flags 440 | ) 441 | { 442 | KEVENT CompletionEvent = {0}; 443 | PIRP Irp = NULL; 444 | WSK_BUF WskBuffer = {0}; 445 | LONG BytesReceived = SOCKET_ERROR; 446 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 447 | 448 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 449 | return SOCKET_ERROR; 450 | 451 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 452 | if (!NT_SUCCESS(Status)) { 453 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 454 | return SOCKET_ERROR; 455 | } 456 | 457 | Status = InitWskData(&Irp, &CompletionEvent); 458 | if (!NT_SUCCESS(Status)) { 459 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 460 | FreeWskBuffer(&WskBuffer); 461 | return SOCKET_ERROR; 462 | } 463 | 464 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskReceive( 465 | WskSocket, 466 | &WskBuffer, 467 | Flags, 468 | Irp); 469 | if (Status == STATUS_PENDING) { 470 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 471 | Status = Irp->IoStatus.Status; 472 | } 473 | 474 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 475 | 476 | IoFreeIrp(Irp); 477 | FreeWskBuffer(&WskBuffer); 478 | return BytesReceived; 479 | } 480 | 481 | LONG 482 | NTAPI 483 | ReceiveFrom( 484 | __in PWSK_SOCKET WskSocket, 485 | __out PVOID Buffer, 486 | __in ULONG BufferSize, 487 | __out_opt PSOCKADDR RemoteAddress, 488 | __out_opt PULONG ControlFlags 489 | ) 490 | { 491 | KEVENT CompletionEvent = {0}; 492 | PIRP Irp = NULL; 493 | WSK_BUF WskBuffer = {0}; 494 | LONG BytesReceived = SOCKET_ERROR; 495 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 496 | 497 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 498 | return SOCKET_ERROR; 499 | 500 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 501 | if (!NT_SUCCESS(Status)) { 502 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 503 | return SOCKET_ERROR; 504 | } 505 | 506 | Status = InitWskData(&Irp, &CompletionEvent); 507 | if (!NT_SUCCESS(Status)) { 508 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 509 | FreeWskBuffer(&WskBuffer); 510 | return SOCKET_ERROR; 511 | } 512 | 513 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskReceiveFrom( 514 | WskSocket, 515 | &WskBuffer, 516 | 0, 517 | RemoteAddress, 518 | 0, 519 | NULL, 520 | ControlFlags, 521 | Irp); 522 | if (Status == STATUS_PENDING) { 523 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 524 | Status = Irp->IoStatus.Status; 525 | } 526 | 527 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 528 | 529 | IoFreeIrp(Irp); 530 | FreeWskBuffer(&WskBuffer); 531 | return BytesReceived; 532 | } 533 | 534 | NTSTATUS 535 | NTAPI 536 | Bind( 537 | __in PWSK_SOCKET WskSocket, 538 | __in PSOCKADDR LocalAddress 539 | ) 540 | { 541 | KEVENT CompletionEvent = {0}; 542 | PIRP Irp = NULL; 543 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 544 | 545 | if (g_SocketsState != INITIALIZED || !WskSocket || !LocalAddress) 546 | return STATUS_INVALID_PARAMETER; 547 | 548 | Status = InitWskData(&Irp, &CompletionEvent); 549 | if (!NT_SUCCESS(Status)) { 550 | KdPrint(("Bind(): InitWskData() failed with status 0x%08X\n", Status)); 551 | return Status; 552 | } 553 | 554 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskBind( 555 | WskSocket, 556 | LocalAddress, 557 | 0, 558 | Irp); 559 | if (Status == STATUS_PENDING) { 560 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 561 | Status = Irp->IoStatus.Status; 562 | } 563 | 564 | IoFreeIrp(Irp); 565 | return Status; 566 | } 567 | 568 | 569 | PWSK_SOCKET 570 | NTAPI 571 | Accept( 572 | __in PWSK_SOCKET WskSocket, 573 | __out_opt PSOCKADDR LocalAddress, 574 | __out_opt PSOCKADDR RemoteAddress 575 | ) 576 | { 577 | KEVENT CompletionEvent = {0}; 578 | PIRP Irp = NULL; 579 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 580 | PWSK_SOCKET AcceptedSocket = NULL; 581 | 582 | if (g_SocketsState != INITIALIZED || !WskSocket) 583 | return NULL; 584 | 585 | Status = InitWskData(&Irp, &CompletionEvent); 586 | if (!NT_SUCCESS(Status)) { 587 | KdPrint(("Accept(): InitWskData() failed with status 0x%08X\n", Status)); 588 | return NULL; 589 | } 590 | 591 | Status = ((PWSK_PROVIDER_LISTEN_DISPATCH)WskSocket->Dispatch)->WskAccept( 592 | WskSocket, 593 | 0, 594 | NULL, 595 | NULL, 596 | LocalAddress, 597 | RemoteAddress, 598 | Irp); 599 | if (Status == STATUS_PENDING) { 600 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 601 | Status = Irp->IoStatus.Status; 602 | } 603 | 604 | AcceptedSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 605 | 606 | IoFreeIrp(Irp); 607 | return AcceptedSocket; 608 | } 609 | -------------------------------------------------------------------------------- /wsktcp/simplewsk.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | Module Name: 4 | 5 | simplewsk.c 6 | 7 | Abstract: 8 | 9 | Wrapper library for WSK functions 10 | 11 | Author: 12 | 13 | MaD, 12-May-2009 14 | 15 | git test 16 | --*/ 17 | 18 | #include "simplewsk.h" 19 | 20 | 21 | static WSK_REGISTRATION g_WskRegistration; 22 | static WSK_PROVIDER_NPI g_WskProvider; 23 | static WSK_CLIENT_DISPATCH g_WskDispatch = {MAKE_WSK_VERSION(1,0), 0, NULL}; 24 | 25 | enum 26 | { 27 | DEINITIALIZED, 28 | DEINITIALIZING, 29 | INITIALIZING, 30 | INITIALIZED 31 | }; 32 | 33 | static LONG g_SocketsState = DEINITIALIZED; 34 | 35 | 36 | 37 | 38 | 39 | static 40 | NTSTATUS 41 | NTAPI 42 | CompletionRoutine( 43 | __in PDEVICE_OBJECT DeviceObject, 44 | __in PIRP Irp, 45 | __in PKEVENT CompletionEvent 46 | ) 47 | { 48 | ASSERT( CompletionEvent ); 49 | 50 | UNREFERENCED_PARAMETER(Irp); 51 | UNREFERENCED_PARAMETER(DeviceObject); 52 | 53 | KeSetEvent(CompletionEvent, IO_NO_INCREMENT, FALSE); 54 | return STATUS_MORE_PROCESSING_REQUIRED; 55 | } 56 | 57 | static 58 | NTSTATUS 59 | InitWskData( 60 | __out PIRP* pIrp, 61 | __out PKEVENT CompletionEvent 62 | ) 63 | { 64 | ASSERT( pIrp ); 65 | ASSERT( CompletionEvent ); 66 | 67 | *pIrp = IoAllocateIrp(1, FALSE); 68 | if (!*pIrp) { 69 | KdPrint(("InitWskData(): IoAllocateIrp() failed\n")); 70 | return STATUS_INSUFFICIENT_RESOURCES; 71 | } 72 | 73 | KeInitializeEvent(CompletionEvent, SynchronizationEvent, FALSE); 74 | IoSetCompletionRoutine(*pIrp, CompletionRoutine, CompletionEvent, TRUE, TRUE, TRUE); 75 | return STATUS_SUCCESS; 76 | } 77 | 78 | static 79 | NTSTATUS 80 | InitWskBuffer( 81 | __in PVOID Buffer, 82 | __in ULONG BufferSize, 83 | __out PWSK_BUF WskBuffer 84 | ) 85 | { 86 | NTSTATUS Status = STATUS_SUCCESS; 87 | 88 | ASSERT( Buffer ); 89 | ASSERT( BufferSize ); 90 | ASSERT( WskBuffer ); 91 | 92 | WskBuffer->Offset = 0; 93 | WskBuffer->Length = BufferSize; 94 | 95 | WskBuffer->Mdl = IoAllocateMdl(Buffer, BufferSize, FALSE, FALSE, NULL); 96 | if (!WskBuffer->Mdl) { 97 | KdPrint(("InitWskBuffer(): IoAllocateMdl() failed\n")); 98 | return STATUS_INSUFFICIENT_RESOURCES; 99 | } 100 | 101 | __try { 102 | MmProbeAndLockPages(WskBuffer->Mdl, KernelMode, IoWriteAccess); 103 | } 104 | __except(EXCEPTION_EXECUTE_HANDLER) { 105 | KdPrint(("InitWskBuffer(): MmProbeAndLockPages(%p) failed\n", Buffer)); 106 | IoFreeMdl(WskBuffer->Mdl); 107 | Status = STATUS_ACCESS_VIOLATION; 108 | } 109 | 110 | return Status; 111 | } 112 | 113 | static 114 | VOID 115 | FreeWskBuffer( 116 | __in PWSK_BUF WskBuffer 117 | ) 118 | { 119 | ASSERT( WskBuffer ); 120 | 121 | 122 | MmUnlockPages(WskBuffer->Mdl); 123 | IoFreeMdl(WskBuffer->Mdl); 124 | } 125 | 126 | // 127 | // Library initialization routine 128 | // 129 | 130 | NTSTATUS NTAPI WSKStartup() 131 | { 132 | WSK_CLIENT_NPI WskClient = {0}; 133 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 134 | 135 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZING, DEINITIALIZED) != DEINITIALIZED) 136 | return STATUS_ALREADY_REGISTERED; 137 | 138 | WskClient.ClientContext = NULL; 139 | WskClient.Dispatch = &g_WskDispatch; 140 | 141 | Status = WskRegister(&WskClient, &g_WskRegistration); 142 | if (!NT_SUCCESS(Status)) { 143 | KdPrint(("WskRegister() failed with status 0x%08X\n", Status)); 144 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 145 | return Status; 146 | } 147 | 148 | Status = WskCaptureProviderNPI(&g_WskRegistration, WSK_NO_WAIT, &g_WskProvider); 149 | if (!NT_SUCCESS(Status)) { 150 | KdPrint(("WskCaptureProviderNPI() failed with status 0x%08X\n", Status)); 151 | WskDeregister(&g_WskRegistration); 152 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 153 | return Status; 154 | } 155 | 156 | InterlockedExchange(&g_SocketsState, INITIALIZED); 157 | return STATUS_SUCCESS; 158 | } 159 | 160 | // 161 | // Library deinitialization routine 162 | // 163 | 164 | VOID NTAPI WSKCleanup() 165 | { 166 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZED, DEINITIALIZING) != INITIALIZED) 167 | return; 168 | 169 | WskReleaseProviderNPI(&g_WskRegistration); 170 | WskDeregister(&g_WskRegistration); 171 | 172 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 173 | } 174 | 175 | 176 | 177 | PWSK_SOCKET 178 | NTAPI 179 | CreateSocket( 180 | __in ADDRESS_FAMILY AddressFamily, 181 | __in USHORT SocketType, 182 | __in ULONG Protocol, 183 | __in ULONG Flags 184 | ) 185 | { 186 | KEVENT CompletionEvent = {0}; 187 | PIRP Irp = NULL; 188 | PWSK_SOCKET WskSocket = NULL; 189 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 190 | 191 | if (g_SocketsState != INITIALIZED) 192 | return NULL; 193 | 194 | Status = InitWskData(&Irp, &CompletionEvent); 195 | if (!NT_SUCCESS(Status)) { 196 | KdPrint(("CreateSocket(): InitWskData() failed with status 0x%08X\n", Status)); 197 | return NULL; 198 | } 199 | 200 | Status = g_WskProvider.Dispatch->WskSocket( 201 | g_WskProvider.Client, 202 | AddressFamily, 203 | SocketType, 204 | Protocol, 205 | Flags, 206 | NULL, 207 | NULL, 208 | NULL, 209 | NULL, 210 | NULL, 211 | Irp); 212 | if (Status == STATUS_PENDING) { 213 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 214 | Status = Irp->IoStatus.Status; 215 | } 216 | 217 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 218 | 219 | IoFreeIrp(Irp); 220 | return (PWSK_SOCKET)WskSocket; 221 | } 222 | 223 | NTSTATUS 224 | NTAPI 225 | CloseSocket( 226 | __in PWSK_SOCKET WskSocket 227 | ) 228 | { 229 | KEVENT CompletionEvent = {0}; 230 | PIRP Irp = NULL; 231 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 232 | 233 | if (g_SocketsState != INITIALIZED || !WskSocket) 234 | return STATUS_INVALID_PARAMETER; 235 | 236 | Status = InitWskData(&Irp, &CompletionEvent); 237 | if (!NT_SUCCESS(Status)) { 238 | KdPrint(("CloseSocket(): InitWskData() failed with status 0x%08X\n", Status)); 239 | return Status; 240 | } 241 | 242 | Status = ((PWSK_PROVIDER_BASIC_DISPATCH)WskSocket->Dispatch)->WskCloseSocket(WskSocket, Irp); 243 | if (Status == STATUS_PENDING) { 244 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 245 | Status = Irp->IoStatus.Status; 246 | } 247 | 248 | IoFreeIrp(Irp); 249 | return Status; 250 | } 251 | 252 | 253 | NTSTATUS 254 | NTAPI 255 | Connect( 256 | __in PWSK_SOCKET WskSocket, 257 | __in PSOCKADDR RemoteAddress 258 | ) 259 | { 260 | KEVENT CompletionEvent = {0}; 261 | PIRP Irp = NULL; 262 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 263 | 264 | if (g_SocketsState != INITIALIZED || !WskSocket || !RemoteAddress) 265 | return STATUS_INVALID_PARAMETER; 266 | 267 | Status = InitWskData(&Irp, &CompletionEvent); 268 | if (!NT_SUCCESS(Status)) { 269 | KdPrint(("Connect(): InitWskData() failed with status 0x%08X\n", Status)); 270 | return Status; 271 | } 272 | 273 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskConnect( 274 | WskSocket, 275 | RemoteAddress, 276 | 0, 277 | Irp); 278 | if (Status == STATUS_PENDING) { 279 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 280 | Status = Irp->IoStatus.Status; 281 | } 282 | 283 | IoFreeIrp(Irp); 284 | return Status; 285 | } 286 | 287 | PWSK_SOCKET 288 | NTAPI 289 | SocketConnect( 290 | __in USHORT SocketType, 291 | __in ULONG Protocol, 292 | __in PSOCKADDR RemoteAddress, 293 | __in PSOCKADDR LocalAddress 294 | ) 295 | { 296 | KEVENT CompletionEvent = {0}; 297 | PIRP Irp = NULL; 298 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 299 | PWSK_SOCKET WskSocket = NULL; 300 | 301 | if (g_SocketsState != INITIALIZED || !RemoteAddress || !LocalAddress) 302 | return NULL; 303 | 304 | Status = InitWskData(&Irp, &CompletionEvent); 305 | if (!NT_SUCCESS(Status)) { 306 | KdPrint(("InitWskData() failed with status 0x%08X\n", Status)); 307 | return NULL; 308 | } 309 | 310 | Status = g_WskProvider.Dispatch->WskSocketConnect( 311 | g_WskProvider.Client, 312 | SocketType, 313 | Protocol, 314 | LocalAddress, 315 | RemoteAddress, 316 | 0, 317 | NULL, 318 | NULL, 319 | NULL, 320 | NULL, 321 | NULL, 322 | Irp); 323 | if (Status == STATUS_PENDING) { 324 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 325 | Status = Irp->IoStatus.Status; 326 | } 327 | 328 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 329 | 330 | IoFreeIrp(Irp); 331 | return WskSocket; 332 | } 333 | 334 | 335 | LONG 336 | NTAPI 337 | Send( 338 | __in PWSK_SOCKET WskSocket, 339 | __in PVOID Buffer, 340 | __in ULONG BufferSize, 341 | __in ULONG Flags 342 | ) 343 | { 344 | KEVENT CompletionEvent = {0}; 345 | PIRP Irp = NULL; 346 | WSK_BUF WskBuffer = {0}; 347 | LONG BytesSent = SOCKET_ERROR; 348 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 349 | 350 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 351 | return SOCKET_ERROR; 352 | 353 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 354 | if (!NT_SUCCESS(Status)) { 355 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 356 | return SOCKET_ERROR; 357 | } 358 | 359 | Status = InitWskData(&Irp, &CompletionEvent); 360 | if (!NT_SUCCESS(Status)) { 361 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 362 | FreeWskBuffer(&WskBuffer); 363 | return SOCKET_ERROR; 364 | } 365 | 366 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskSend( 367 | WskSocket, 368 | &WskBuffer, 369 | Flags, 370 | Irp); 371 | if (Status == STATUS_PENDING) { 372 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 373 | Status = Irp->IoStatus.Status; 374 | } 375 | 376 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 377 | 378 | IoFreeIrp(Irp); 379 | FreeWskBuffer(&WskBuffer); 380 | return BytesSent; 381 | } 382 | 383 | LONG 384 | NTAPI 385 | SendTo( 386 | __in PWSK_SOCKET WskSocket, 387 | __in PVOID Buffer, 388 | __in ULONG BufferSize, 389 | __in_opt PSOCKADDR RemoteAddress 390 | ) 391 | { 392 | KEVENT CompletionEvent = {0}; 393 | PIRP Irp = NULL; 394 | WSK_BUF WskBuffer = {0}; 395 | LONG BytesSent = SOCKET_ERROR; 396 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 397 | 398 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 399 | return SOCKET_ERROR; 400 | 401 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 402 | if (!NT_SUCCESS(Status)) { 403 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 404 | return SOCKET_ERROR; 405 | } 406 | 407 | Status = InitWskData(&Irp, &CompletionEvent); 408 | if (!NT_SUCCESS(Status)) { 409 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 410 | FreeWskBuffer(&WskBuffer); 411 | return SOCKET_ERROR; 412 | } 413 | 414 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskSendTo( 415 | WskSocket, 416 | &WskBuffer, 417 | 0, 418 | RemoteAddress, 419 | 0, 420 | NULL, 421 | Irp); 422 | if (Status == STATUS_PENDING) { 423 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 424 | Status = Irp->IoStatus.Status; 425 | } 426 | 427 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 428 | 429 | IoFreeIrp(Irp); 430 | FreeWskBuffer(&WskBuffer); 431 | return BytesSent; 432 | } 433 | 434 | LONG 435 | NTAPI 436 | Receive( 437 | __in PWSK_SOCKET WskSocket, 438 | __out PVOID Buffer, 439 | __in ULONG BufferSize, 440 | __in ULONG Flags 441 | ) 442 | { 443 | KEVENT CompletionEvent = {0}; 444 | PIRP Irp = NULL; 445 | WSK_BUF WskBuffer = {0}; 446 | LONG BytesReceived = SOCKET_ERROR; 447 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 448 | 449 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 450 | return SOCKET_ERROR; 451 | 452 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 453 | if (!NT_SUCCESS(Status)) { 454 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 455 | return SOCKET_ERROR; 456 | } 457 | 458 | Status = InitWskData(&Irp, &CompletionEvent); 459 | if (!NT_SUCCESS(Status)) { 460 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 461 | FreeWskBuffer(&WskBuffer); 462 | return SOCKET_ERROR; 463 | } 464 | 465 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskReceive( 466 | WskSocket, 467 | &WskBuffer, 468 | Flags, 469 | Irp); 470 | if (Status == STATUS_PENDING) { 471 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 472 | Status = Irp->IoStatus.Status; 473 | } 474 | 475 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 476 | 477 | IoFreeIrp(Irp); 478 | FreeWskBuffer(&WskBuffer); 479 | return BytesReceived; 480 | } 481 | 482 | LONG 483 | NTAPI 484 | ReceiveFrom( 485 | __in PWSK_SOCKET WskSocket, 486 | __out PVOID Buffer, 487 | __in ULONG BufferSize, 488 | __out_opt PSOCKADDR RemoteAddress, 489 | __out_opt PULONG ControlFlags 490 | ) 491 | { 492 | KEVENT CompletionEvent = {0}; 493 | PIRP Irp = NULL; 494 | WSK_BUF WskBuffer = {0}; 495 | LONG BytesReceived = SOCKET_ERROR; 496 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 497 | 498 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 499 | return SOCKET_ERROR; 500 | 501 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 502 | if (!NT_SUCCESS(Status)) { 503 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 504 | return SOCKET_ERROR; 505 | } 506 | 507 | Status = InitWskData(&Irp, &CompletionEvent); 508 | if (!NT_SUCCESS(Status)) { 509 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 510 | FreeWskBuffer(&WskBuffer); 511 | return SOCKET_ERROR; 512 | } 513 | 514 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskReceiveFrom( 515 | WskSocket, 516 | &WskBuffer, 517 | 0, 518 | RemoteAddress, 519 | 0, 520 | NULL, 521 | ControlFlags, 522 | Irp); 523 | if (Status == STATUS_PENDING) { 524 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 525 | Status = Irp->IoStatus.Status; 526 | } 527 | 528 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 529 | 530 | IoFreeIrp(Irp); 531 | FreeWskBuffer(&WskBuffer); 532 | return BytesReceived; 533 | } 534 | 535 | NTSTATUS 536 | NTAPI 537 | Bind( 538 | __in PWSK_SOCKET WskSocket, 539 | __in PSOCKADDR LocalAddress 540 | ) 541 | { 542 | KEVENT CompletionEvent = {0}; 543 | PIRP Irp = NULL; 544 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 545 | 546 | if (g_SocketsState != INITIALIZED || !WskSocket || !LocalAddress) 547 | return STATUS_INVALID_PARAMETER; 548 | 549 | Status = InitWskData(&Irp, &CompletionEvent); 550 | if (!NT_SUCCESS(Status)) { 551 | KdPrint(("Bind(): InitWskData() failed with status 0x%08X\n", Status)); 552 | return Status; 553 | } 554 | 555 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskBind( 556 | WskSocket, 557 | LocalAddress, 558 | 0, 559 | Irp); 560 | if (Status == STATUS_PENDING) { 561 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 562 | Status = Irp->IoStatus.Status; 563 | } 564 | 565 | IoFreeIrp(Irp); 566 | return Status; 567 | } 568 | 569 | 570 | PWSK_SOCKET 571 | NTAPI 572 | Accept( 573 | __in PWSK_SOCKET WskSocket, 574 | __out_opt PSOCKADDR LocalAddress, 575 | __out_opt PSOCKADDR RemoteAddress 576 | ) 577 | { 578 | KEVENT CompletionEvent = {0}; 579 | PIRP Irp = NULL; 580 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 581 | PWSK_SOCKET AcceptedSocket = NULL; 582 | 583 | if (g_SocketsState != INITIALIZED || !WskSocket) 584 | return NULL; 585 | 586 | Status = InitWskData(&Irp, &CompletionEvent); 587 | if (!NT_SUCCESS(Status)) { 588 | KdPrint(("Accept(): InitWskData() failed with status 0x%08X\n", Status)); 589 | return NULL; 590 | } 591 | 592 | Status = ((PWSK_PROVIDER_LISTEN_DISPATCH)WskSocket->Dispatch)->WskAccept( 593 | WskSocket, 594 | 0, 595 | NULL, 596 | NULL, 597 | LocalAddress, 598 | RemoteAddress, 599 | Irp); 600 | if (Status == STATUS_PENDING) { 601 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 602 | Status = Irp->IoStatus.Status; 603 | } 604 | 605 | AcceptedSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 606 | 607 | IoFreeIrp(Irp); 608 | return AcceptedSocket; 609 | } 610 | -------------------------------------------------------------------------------- /wsktcpcli/wsktcpcli/simplewsk.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | Module Name: 4 | 5 | simplewsk.c 6 | 7 | Abstract: 8 | 9 | Wrapper library for WSK functions 10 | 11 | Author: 12 | 13 | MaD, 12-May-2009 14 | 15 | git test 16 | --*/ 17 | 18 | #include "simplewsk.h" 19 | 20 | 21 | static WSK_REGISTRATION g_WskRegistration; 22 | static WSK_PROVIDER_NPI g_WskProvider; 23 | static WSK_CLIENT_DISPATCH g_WskDispatch = {MAKE_WSK_VERSION(1,0), 0, NULL}; 24 | 25 | enum 26 | { 27 | DEINITIALIZED, 28 | DEINITIALIZING, 29 | INITIALIZING, 30 | INITIALIZED 31 | }; 32 | 33 | static LONG g_SocketsState = DEINITIALIZED; 34 | 35 | 36 | 37 | 38 | 39 | static 40 | NTSTATUS 41 | NTAPI 42 | CompletionRoutine( 43 | __in PDEVICE_OBJECT DeviceObject, 44 | __in PIRP Irp, 45 | __in PKEVENT CompletionEvent 46 | ) 47 | { 48 | ASSERT( CompletionEvent ); 49 | 50 | UNREFERENCED_PARAMETER(Irp); 51 | UNREFERENCED_PARAMETER(DeviceObject); 52 | 53 | KeSetEvent(CompletionEvent, IO_NO_INCREMENT, FALSE); 54 | return STATUS_MORE_PROCESSING_REQUIRED; 55 | } 56 | 57 | 58 | static 59 | NTSTATUS 60 | InitWskData( 61 | __out PIRP* pIrp, 62 | __out PKEVENT CompletionEvent 63 | ) 64 | { 65 | ASSERT( pIrp ); 66 | ASSERT( CompletionEvent ); 67 | 68 | *pIrp = IoAllocateIrp(1, FALSE); 69 | if (!*pIrp) { 70 | KdPrint(("InitWskData(): IoAllocateIrp() failed\n")); 71 | return STATUS_INSUFFICIENT_RESOURCES; 72 | } 73 | 74 | KeInitializeEvent(CompletionEvent, SynchronizationEvent, FALSE); 75 | IoSetCompletionRoutine(*pIrp, CompletionRoutine, CompletionEvent, TRUE, TRUE, TRUE); 76 | return STATUS_SUCCESS; 77 | } 78 | 79 | 80 | 81 | NTSTATUS 82 | InitWskBuffer( 83 | __in PVOID Buffer, 84 | __in ULONG BufferSize, 85 | __out PWSK_BUF WskBuffer 86 | ) 87 | { 88 | NTSTATUS Status = STATUS_SUCCESS; 89 | 90 | ASSERT( Buffer ); 91 | ASSERT( BufferSize ); 92 | ASSERT( WskBuffer ); 93 | 94 | WskBuffer->Offset = 0; 95 | WskBuffer->Length = BufferSize; 96 | 97 | WskBuffer->Mdl = IoAllocateMdl(Buffer, BufferSize, FALSE, FALSE, NULL); 98 | if (!WskBuffer->Mdl) { 99 | KdPrint(("InitWskBuffer(): IoAllocateMdl() failed\n")); 100 | return STATUS_INSUFFICIENT_RESOURCES; 101 | } 102 | 103 | __try { 104 | MmProbeAndLockPages(WskBuffer->Mdl, KernelMode, IoWriteAccess); 105 | } 106 | __except(EXCEPTION_EXECUTE_HANDLER) { 107 | KdPrint(("InitWskBuffer(): MmProbeAndLockPages(%p) failed\n", Buffer)); 108 | IoFreeMdl(WskBuffer->Mdl); 109 | Status = STATUS_ACCESS_VIOLATION; 110 | } 111 | 112 | return Status; 113 | } 114 | 115 | 116 | VOID 117 | FreeWskBuffer( 118 | __in PWSK_BUF WskBuffer 119 | ) 120 | { 121 | ASSERT( WskBuffer ); 122 | 123 | 124 | MmUnlockPages(WskBuffer->Mdl); 125 | IoFreeMdl(WskBuffer->Mdl); 126 | } 127 | 128 | // 129 | // Library initialization routine 130 | // 131 | 132 | NTSTATUS NTAPI WSKStartup() 133 | { 134 | WSK_CLIENT_NPI WskClient = {0}; 135 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 136 | 137 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZING, DEINITIALIZED) != DEINITIALIZED) 138 | return STATUS_ALREADY_REGISTERED; 139 | 140 | WskClient.ClientContext = NULL; 141 | WskClient.Dispatch = &g_WskDispatch; 142 | 143 | Status = WskRegister(&WskClient, &g_WskRegistration); 144 | if (!NT_SUCCESS(Status)) { 145 | KdPrint(("WskRegister() failed with status 0x%08X\n", Status)); 146 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 147 | return Status; 148 | } 149 | 150 | Status = WskCaptureProviderNPI(&g_WskRegistration, WSK_NO_WAIT, &g_WskProvider); 151 | if (!NT_SUCCESS(Status)) { 152 | KdPrint(("WskCaptureProviderNPI() failed with status 0x%08X\n", Status)); 153 | WskDeregister(&g_WskRegistration); 154 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 155 | return Status; 156 | } 157 | 158 | InterlockedExchange(&g_SocketsState, INITIALIZED); 159 | return STATUS_SUCCESS; 160 | } 161 | 162 | // 163 | // Library deinitialization routine 164 | // 165 | 166 | VOID NTAPI WSKCleanup() 167 | { 168 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZED, DEINITIALIZING) != INITIALIZED) 169 | return; 170 | 171 | WskReleaseProviderNPI(&g_WskRegistration); 172 | WskDeregister(&g_WskRegistration); 173 | 174 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 175 | } 176 | 177 | 178 | 179 | PWSK_SOCKET 180 | NTAPI 181 | CreateSocket( 182 | __in ADDRESS_FAMILY AddressFamily, 183 | __in USHORT SocketType, 184 | __in ULONG Protocol, 185 | __in ULONG Flags 186 | ) 187 | { 188 | KEVENT CompletionEvent = {0}; 189 | PIRP Irp = NULL; 190 | PWSK_SOCKET WskSocket = NULL; 191 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 192 | 193 | if (g_SocketsState != INITIALIZED) 194 | return NULL; 195 | 196 | Status = InitWskData(&Irp, &CompletionEvent); 197 | if (!NT_SUCCESS(Status)) { 198 | KdPrint(("CreateSocket(): InitWskData() failed with status 0x%08X\n", Status)); 199 | return NULL; 200 | } 201 | 202 | Status = g_WskProvider.Dispatch->WskSocket( 203 | g_WskProvider.Client, 204 | AddressFamily, 205 | SocketType, 206 | Protocol, 207 | Flags, 208 | NULL, 209 | NULL, 210 | NULL, 211 | NULL, 212 | NULL, 213 | Irp); 214 | if (Status == STATUS_PENDING) { 215 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 216 | Status = Irp->IoStatus.Status; 217 | } 218 | 219 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 220 | 221 | IoFreeIrp(Irp); 222 | return (PWSK_SOCKET)WskSocket; 223 | } 224 | 225 | NTSTATUS 226 | NTAPI 227 | CloseSocket( 228 | __in PWSK_SOCKET WskSocket 229 | ) 230 | { 231 | KEVENT CompletionEvent = {0}; 232 | PIRP Irp = NULL; 233 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 234 | 235 | if (g_SocketsState != INITIALIZED || !WskSocket) 236 | return STATUS_INVALID_PARAMETER; 237 | 238 | Status = InitWskData(&Irp, &CompletionEvent); 239 | if (!NT_SUCCESS(Status)) { 240 | KdPrint(("CloseSocket(): InitWskData() failed with status 0x%08X\n", Status)); 241 | return Status; 242 | } 243 | 244 | Status = ((PWSK_PROVIDER_BASIC_DISPATCH)WskSocket->Dispatch)->WskCloseSocket(WskSocket, Irp); 245 | if (Status == STATUS_PENDING) { 246 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 247 | Status = Irp->IoStatus.Status; 248 | } 249 | 250 | IoFreeIrp(Irp); 251 | return Status; 252 | } 253 | 254 | 255 | NTSTATUS 256 | NTAPI 257 | Connect( 258 | __in PWSK_SOCKET WskSocket, 259 | __in PSOCKADDR RemoteAddress 260 | ) 261 | { 262 | KEVENT CompletionEvent = {0}; 263 | PIRP Irp = NULL; 264 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 265 | 266 | if (g_SocketsState != INITIALIZED || !WskSocket || !RemoteAddress) 267 | return STATUS_INVALID_PARAMETER; 268 | 269 | Status = InitWskData(&Irp, &CompletionEvent); 270 | if (!NT_SUCCESS(Status)) { 271 | KdPrint(("Connect(): InitWskData() failed with status 0x%08X\n", Status)); 272 | return Status; 273 | } 274 | 275 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskConnect( 276 | WskSocket, 277 | RemoteAddress, 278 | 0, 279 | Irp); 280 | if (Status == STATUS_PENDING) { 281 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 282 | Status = Irp->IoStatus.Status; 283 | } 284 | 285 | IoFreeIrp(Irp); 286 | return Status; 287 | } 288 | 289 | PWSK_SOCKET 290 | NTAPI 291 | SocketConnect( 292 | __in USHORT SocketType, 293 | __in ULONG Protocol, 294 | __in PSOCKADDR RemoteAddress, 295 | __in PSOCKADDR LocalAddress 296 | ) 297 | { 298 | KEVENT CompletionEvent = {0}; 299 | PIRP Irp = NULL; 300 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 301 | PWSK_SOCKET WskSocket = NULL; 302 | 303 | if (g_SocketsState != INITIALIZED || !RemoteAddress || !LocalAddress) 304 | return NULL; 305 | 306 | Status = InitWskData(&Irp, &CompletionEvent); 307 | if (!NT_SUCCESS(Status)) { 308 | KdPrint(("InitWskData() failed with status 0x%08X\n", Status)); 309 | return NULL; 310 | } 311 | 312 | Status = g_WskProvider.Dispatch->WskSocketConnect( 313 | g_WskProvider.Client, 314 | SocketType, 315 | Protocol, 316 | LocalAddress, 317 | RemoteAddress, 318 | 0, 319 | NULL, 320 | NULL, 321 | NULL, 322 | NULL, 323 | NULL, 324 | Irp); 325 | if (Status == STATUS_PENDING) { 326 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 327 | Status = Irp->IoStatus.Status; 328 | } 329 | 330 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 331 | 332 | IoFreeIrp(Irp); 333 | return WskSocket; 334 | } 335 | 336 | NTSTATUS 337 | NTAPI 338 | DisConnect( 339 | PWSK_SOCKET WskSocket 340 | ) 341 | { 342 | KEVENT CompletionEvent = { 0 }; 343 | PIRP Irp = NULL; 344 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 345 | 346 | if (WskSocket == NULL) { 347 | return Status; 348 | } 349 | Status = InitWskData(&Irp, &CompletionEvent); 350 | if (!NT_SUCCESS(Status)) { 351 | KdPrint(("Connect(): InitWskData() failed with status 0x%08X\n", Status)); 352 | return Status; 353 | } 354 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskDisconnect( 355 | WskSocket, 356 | NULL, 357 | 0, 358 | Irp); 359 | if (Status == STATUS_PENDING) { 360 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 361 | Status = Irp->IoStatus.Status; 362 | } 363 | 364 | IoFreeIrp(Irp); 365 | return Status; 366 | 367 | } 368 | 369 | LONG 370 | NTAPI 371 | Send( 372 | __in PWSK_SOCKET WskSocket, 373 | __in PVOID Buffer, 374 | __in ULONG BufferSize, 375 | __in ULONG Flags 376 | ) 377 | { 378 | KEVENT CompletionEvent = {0}; 379 | PIRP Irp = NULL; 380 | WSK_BUF WskBuffer = {0}; 381 | LONG BytesSent = SOCKET_ERROR; 382 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 383 | 384 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 385 | return SOCKET_ERROR; 386 | 387 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 388 | if (!NT_SUCCESS(Status)) { 389 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 390 | return SOCKET_ERROR; 391 | } 392 | 393 | Status = InitWskData(&Irp, &CompletionEvent); 394 | if (!NT_SUCCESS(Status)) { 395 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 396 | FreeWskBuffer(&WskBuffer); 397 | return SOCKET_ERROR; 398 | } 399 | 400 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskSend( 401 | WskSocket, 402 | &WskBuffer, 403 | Flags, 404 | Irp); 405 | if (Status == STATUS_PENDING) { 406 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 407 | Status = Irp->IoStatus.Status; 408 | } 409 | 410 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 411 | 412 | IoFreeIrp(Irp); 413 | FreeWskBuffer(&WskBuffer); 414 | return BytesSent; 415 | } 416 | 417 | LONG 418 | NTAPI 419 | SendTo( 420 | __in PWSK_SOCKET WskSocket, 421 | __in PVOID Buffer, 422 | __in ULONG BufferSize, 423 | __in_opt PSOCKADDR RemoteAddress 424 | ) 425 | { 426 | KEVENT CompletionEvent = {0}; 427 | PIRP Irp = NULL; 428 | WSK_BUF WskBuffer = {0}; 429 | LONG BytesSent = SOCKET_ERROR; 430 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 431 | 432 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 433 | return SOCKET_ERROR; 434 | 435 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 436 | if (!NT_SUCCESS(Status)) { 437 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 438 | return SOCKET_ERROR; 439 | } 440 | 441 | Status = InitWskData(&Irp, &CompletionEvent); 442 | if (!NT_SUCCESS(Status)) { 443 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 444 | FreeWskBuffer(&WskBuffer); 445 | return SOCKET_ERROR; 446 | } 447 | 448 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskSendTo( 449 | WskSocket, 450 | &WskBuffer, 451 | 0, 452 | RemoteAddress, 453 | 0, 454 | NULL, 455 | Irp); 456 | if (Status == STATUS_PENDING) { 457 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 458 | Status = Irp->IoStatus.Status; 459 | } 460 | 461 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 462 | 463 | IoFreeIrp(Irp); 464 | FreeWskBuffer(&WskBuffer); 465 | return BytesSent; 466 | } 467 | 468 | LONG 469 | NTAPI 470 | Receive( 471 | __in PWSK_SOCKET WskSocket, 472 | __out PVOID Buffer, 473 | __in ULONG BufferSize, 474 | __in ULONG Flags 475 | ) 476 | { 477 | KEVENT CompletionEvent = {0}; 478 | PIRP Irp = NULL; 479 | WSK_BUF WskBuffer = {0}; 480 | LONG BytesReceived = SOCKET_ERROR; 481 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 482 | 483 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 484 | return SOCKET_ERROR; 485 | 486 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 487 | if (!NT_SUCCESS(Status)) { 488 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 489 | return SOCKET_ERROR; 490 | } 491 | 492 | Status = InitWskData(&Irp, &CompletionEvent); 493 | if (!NT_SUCCESS(Status)) { 494 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 495 | FreeWskBuffer(&WskBuffer); 496 | return SOCKET_ERROR; 497 | } 498 | 499 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskReceive( 500 | WskSocket, 501 | &WskBuffer, 502 | Flags, 503 | Irp); 504 | if (Status == STATUS_PENDING) { 505 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 506 | Status = Irp->IoStatus.Status; 507 | } 508 | 509 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 510 | 511 | IoFreeIrp(Irp); 512 | FreeWskBuffer(&WskBuffer); 513 | return BytesReceived; 514 | } 515 | 516 | LONG 517 | NTAPI 518 | ReceiveFrom( 519 | __in PWSK_SOCKET WskSocket, 520 | __out PVOID Buffer, 521 | __in ULONG BufferSize, 522 | __out_opt PSOCKADDR RemoteAddress, 523 | __out_opt PULONG ControlFlags 524 | ) 525 | { 526 | KEVENT CompletionEvent = {0}; 527 | PIRP Irp = NULL; 528 | WSK_BUF WskBuffer = {0}; 529 | LONG BytesReceived = SOCKET_ERROR; 530 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 531 | 532 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 533 | return SOCKET_ERROR; 534 | 535 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 536 | if (!NT_SUCCESS(Status)) { 537 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 538 | return SOCKET_ERROR; 539 | } 540 | 541 | Status = InitWskData(&Irp, &CompletionEvent); 542 | if (!NT_SUCCESS(Status)) { 543 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 544 | FreeWskBuffer(&WskBuffer); 545 | return SOCKET_ERROR; 546 | } 547 | 548 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskReceiveFrom( 549 | WskSocket, 550 | &WskBuffer, 551 | 0, 552 | RemoteAddress, 553 | 0, 554 | NULL, 555 | ControlFlags, 556 | Irp); 557 | if (Status == STATUS_PENDING) { 558 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 559 | Status = Irp->IoStatus.Status; 560 | } 561 | 562 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 563 | 564 | IoFreeIrp(Irp); 565 | FreeWskBuffer(&WskBuffer); 566 | return BytesReceived; 567 | } 568 | 569 | NTSTATUS 570 | NTAPI 571 | Bind( 572 | __in PWSK_SOCKET WskSocket, 573 | __in PSOCKADDR LocalAddress 574 | ) 575 | { 576 | KEVENT CompletionEvent = {0}; 577 | PIRP Irp = NULL; 578 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 579 | 580 | if (g_SocketsState != INITIALIZED || !WskSocket || !LocalAddress) 581 | return STATUS_INVALID_PARAMETER; 582 | 583 | Status = InitWskData(&Irp, &CompletionEvent); 584 | if (!NT_SUCCESS(Status)) { 585 | KdPrint(("Bind(): InitWskData() failed with status 0x%08X\n", Status)); 586 | return Status; 587 | } 588 | 589 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskBind( 590 | WskSocket, 591 | LocalAddress, 592 | 0, 593 | Irp); 594 | if (Status == STATUS_PENDING) { 595 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 596 | Status = Irp->IoStatus.Status; 597 | } 598 | 599 | IoFreeIrp(Irp); 600 | return Status; 601 | } 602 | 603 | 604 | PWSK_SOCKET 605 | NTAPI 606 | Accept( 607 | __in PWSK_SOCKET WskSocket, 608 | __out_opt PSOCKADDR LocalAddress, 609 | __out_opt PSOCKADDR RemoteAddress 610 | ) 611 | { 612 | KEVENT CompletionEvent = {0}; 613 | PIRP Irp = NULL; 614 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 615 | PWSK_SOCKET AcceptedSocket = NULL; 616 | 617 | if (g_SocketsState != INITIALIZED || !WskSocket) 618 | return NULL; 619 | 620 | Status = InitWskData(&Irp, &CompletionEvent); 621 | if (!NT_SUCCESS(Status)) { 622 | KdPrint(("Accept(): InitWskData() failed with status 0x%08X\n", Status)); 623 | return NULL; 624 | } 625 | 626 | Status = ((PWSK_PROVIDER_LISTEN_DISPATCH)WskSocket->Dispatch)->WskAccept( 627 | WskSocket, 628 | 0, 629 | NULL, 630 | NULL, 631 | LocalAddress, 632 | RemoteAddress, 633 | Irp); 634 | if (Status == STATUS_PENDING) { 635 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 636 | Status = Irp->IoStatus.Status; 637 | } 638 | 639 | AcceptedSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 640 | 641 | IoFreeIrp(Irp); 642 | return AcceptedSocket; 643 | } 644 | -------------------------------------------------------------------------------- /wsktcpsrv/wsktcpsrv/simplewsk.c: -------------------------------------------------------------------------------- 1 | /*++ 2 | 3 | Module Name: 4 | 5 | simplewsk.c 6 | 7 | Abstract: 8 | 9 | Wrapper library for WSK functions 10 | 11 | Author: 12 | 13 | MaD, 12-May-2009 14 | 15 | git test 16 | --*/ 17 | 18 | #include "simplewsk.h" 19 | 20 | 21 | static WSK_REGISTRATION g_WskRegistration; 22 | static WSK_PROVIDER_NPI g_WskProvider; 23 | static WSK_CLIENT_DISPATCH g_WskDispatch = {MAKE_WSK_VERSION(1,0), 0, NULL}; 24 | 25 | enum 26 | { 27 | DEINITIALIZED, 28 | DEINITIALIZING, 29 | INITIALIZING, 30 | INITIALIZED 31 | }; 32 | 33 | static LONG g_SocketsState = DEINITIALIZED; 34 | 35 | 36 | 37 | 38 | 39 | static 40 | NTSTATUS 41 | NTAPI 42 | CompletionRoutine( 43 | __in PDEVICE_OBJECT DeviceObject, 44 | __in PIRP Irp, 45 | __in PKEVENT CompletionEvent 46 | ) 47 | { 48 | ASSERT( CompletionEvent ); 49 | 50 | UNREFERENCED_PARAMETER(Irp); 51 | UNREFERENCED_PARAMETER(DeviceObject); 52 | 53 | KeSetEvent(CompletionEvent, IO_NO_INCREMENT, FALSE); 54 | return STATUS_MORE_PROCESSING_REQUIRED; 55 | } 56 | 57 | 58 | static 59 | NTSTATUS 60 | InitWskData( 61 | __out PIRP* pIrp, 62 | __out PKEVENT CompletionEvent 63 | ) 64 | { 65 | ASSERT( pIrp ); 66 | ASSERT( CompletionEvent ); 67 | 68 | *pIrp = IoAllocateIrp(1, FALSE); 69 | if (!*pIrp) { 70 | KdPrint(("InitWskData(): IoAllocateIrp() failed\n")); 71 | return STATUS_INSUFFICIENT_RESOURCES; 72 | } 73 | 74 | KeInitializeEvent(CompletionEvent, SynchronizationEvent, FALSE); 75 | IoSetCompletionRoutine(*pIrp, CompletionRoutine, CompletionEvent, TRUE, TRUE, TRUE); 76 | return STATUS_SUCCESS; 77 | } 78 | 79 | 80 | 81 | NTSTATUS 82 | InitWskBuffer( 83 | __in PVOID Buffer, 84 | __in ULONG BufferSize, 85 | __out PWSK_BUF WskBuffer 86 | ) 87 | { 88 | NTSTATUS Status = STATUS_SUCCESS; 89 | 90 | ASSERT( Buffer ); 91 | ASSERT( BufferSize ); 92 | ASSERT( WskBuffer ); 93 | 94 | WskBuffer->Offset = 0; 95 | WskBuffer->Length = BufferSize; 96 | 97 | WskBuffer->Mdl = IoAllocateMdl(Buffer, BufferSize, FALSE, FALSE, NULL); 98 | if (!WskBuffer->Mdl) { 99 | KdPrint(("InitWskBuffer(): IoAllocateMdl() failed\n")); 100 | return STATUS_INSUFFICIENT_RESOURCES; 101 | } 102 | 103 | __try { 104 | MmProbeAndLockPages(WskBuffer->Mdl, KernelMode, IoWriteAccess); 105 | } 106 | __except(EXCEPTION_EXECUTE_HANDLER) { 107 | KdPrint(("InitWskBuffer(): MmProbeAndLockPages(%p) failed\n", Buffer)); 108 | IoFreeMdl(WskBuffer->Mdl); 109 | Status = STATUS_ACCESS_VIOLATION; 110 | } 111 | 112 | return Status; 113 | } 114 | 115 | 116 | VOID 117 | FreeWskBuffer( 118 | __in PWSK_BUF WskBuffer 119 | ) 120 | { 121 | ASSERT( WskBuffer ); 122 | 123 | 124 | MmUnlockPages(WskBuffer->Mdl); 125 | IoFreeMdl(WskBuffer->Mdl); 126 | } 127 | 128 | // 129 | // Library initialization routine 130 | // 131 | 132 | NTSTATUS NTAPI WSKStartup() 133 | { 134 | WSK_CLIENT_NPI WskClient = {0}; 135 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 136 | 137 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZING, DEINITIALIZED) != DEINITIALIZED) 138 | return STATUS_ALREADY_REGISTERED; 139 | 140 | WskClient.ClientContext = NULL; 141 | WskClient.Dispatch = &g_WskDispatch; 142 | 143 | Status = WskRegister(&WskClient, &g_WskRegistration); 144 | if (!NT_SUCCESS(Status)) { 145 | KdPrint(("WskRegister() failed with status 0x%08X\n", Status)); 146 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 147 | return Status; 148 | } 149 | 150 | Status = WskCaptureProviderNPI(&g_WskRegistration, WSK_NO_WAIT, &g_WskProvider); 151 | if (!NT_SUCCESS(Status)) { 152 | KdPrint(("WskCaptureProviderNPI() failed with status 0x%08X\n", Status)); 153 | WskDeregister(&g_WskRegistration); 154 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 155 | return Status; 156 | } 157 | 158 | InterlockedExchange(&g_SocketsState, INITIALIZED); 159 | return STATUS_SUCCESS; 160 | } 161 | 162 | // 163 | // Library deinitialization routine 164 | // 165 | 166 | VOID NTAPI WSKCleanup() 167 | { 168 | if (InterlockedCompareExchange(&g_SocketsState, INITIALIZED, DEINITIALIZING) != INITIALIZED) 169 | return; 170 | 171 | WskReleaseProviderNPI(&g_WskRegistration); 172 | WskDeregister(&g_WskRegistration); 173 | 174 | InterlockedExchange(&g_SocketsState, DEINITIALIZED); 175 | } 176 | 177 | 178 | 179 | PWSK_SOCKET 180 | NTAPI 181 | CreateSocket( 182 | __in ADDRESS_FAMILY AddressFamily, 183 | __in USHORT SocketType, 184 | __in ULONG Protocol, 185 | __in ULONG Flags 186 | ) 187 | { 188 | KEVENT CompletionEvent = {0}; 189 | PIRP Irp = NULL; 190 | PWSK_SOCKET WskSocket = NULL; 191 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 192 | 193 | if (g_SocketsState != INITIALIZED) 194 | return NULL; 195 | 196 | Status = InitWskData(&Irp, &CompletionEvent); 197 | if (!NT_SUCCESS(Status)) { 198 | KdPrint(("CreateSocket(): InitWskData() failed with status 0x%08X\n", Status)); 199 | return NULL; 200 | } 201 | 202 | Status = g_WskProvider.Dispatch->WskSocket( 203 | g_WskProvider.Client, 204 | AddressFamily, 205 | SocketType, 206 | Protocol, 207 | Flags, 208 | NULL, 209 | NULL, 210 | NULL, 211 | NULL, 212 | NULL, 213 | Irp); 214 | if (Status == STATUS_PENDING) { 215 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 216 | Status = Irp->IoStatus.Status; 217 | } 218 | 219 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 220 | 221 | IoFreeIrp(Irp); 222 | return (PWSK_SOCKET)WskSocket; 223 | } 224 | 225 | NTSTATUS 226 | NTAPI 227 | CloseSocket( 228 | __in PWSK_SOCKET WskSocket 229 | ) 230 | { 231 | KEVENT CompletionEvent = {0}; 232 | PIRP Irp = NULL; 233 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 234 | 235 | if (g_SocketsState != INITIALIZED || !WskSocket) 236 | return STATUS_INVALID_PARAMETER; 237 | 238 | Status = InitWskData(&Irp, &CompletionEvent); 239 | if (!NT_SUCCESS(Status)) { 240 | KdPrint(("CloseSocket(): InitWskData() failed with status 0x%08X\n", Status)); 241 | return Status; 242 | } 243 | 244 | Status = ((PWSK_PROVIDER_BASIC_DISPATCH)WskSocket->Dispatch)->WskCloseSocket(WskSocket, Irp); 245 | if (Status == STATUS_PENDING) { 246 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 247 | Status = Irp->IoStatus.Status; 248 | } 249 | 250 | IoFreeIrp(Irp); 251 | return Status; 252 | } 253 | 254 | 255 | NTSTATUS 256 | NTAPI 257 | Connect( 258 | __in PWSK_SOCKET WskSocket, 259 | __in PSOCKADDR RemoteAddress 260 | ) 261 | { 262 | KEVENT CompletionEvent = {0}; 263 | PIRP Irp = NULL; 264 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 265 | 266 | if (g_SocketsState != INITIALIZED || !WskSocket || !RemoteAddress) 267 | return STATUS_INVALID_PARAMETER; 268 | 269 | Status = InitWskData(&Irp, &CompletionEvent); 270 | if (!NT_SUCCESS(Status)) { 271 | KdPrint(("Connect(): InitWskData() failed with status 0x%08X\n", Status)); 272 | return Status; 273 | } 274 | 275 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskConnect( 276 | WskSocket, 277 | RemoteAddress, 278 | 0, 279 | Irp); 280 | if (Status == STATUS_PENDING) { 281 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 282 | Status = Irp->IoStatus.Status; 283 | } 284 | 285 | IoFreeIrp(Irp); 286 | return Status; 287 | } 288 | 289 | PWSK_SOCKET 290 | NTAPI 291 | SocketConnect( 292 | __in USHORT SocketType, 293 | __in ULONG Protocol, 294 | __in PSOCKADDR RemoteAddress, 295 | __in PSOCKADDR LocalAddress 296 | ) 297 | { 298 | KEVENT CompletionEvent = {0}; 299 | PIRP Irp = NULL; 300 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 301 | PWSK_SOCKET WskSocket = NULL; 302 | 303 | if (g_SocketsState != INITIALIZED || !RemoteAddress || !LocalAddress) 304 | return NULL; 305 | 306 | Status = InitWskData(&Irp, &CompletionEvent); 307 | if (!NT_SUCCESS(Status)) { 308 | KdPrint(("InitWskData() failed with status 0x%08X\n", Status)); 309 | return NULL; 310 | } 311 | 312 | Status = g_WskProvider.Dispatch->WskSocketConnect( 313 | g_WskProvider.Client, 314 | SocketType, 315 | Protocol, 316 | LocalAddress, 317 | RemoteAddress, 318 | 0, 319 | NULL, 320 | NULL, 321 | NULL, 322 | NULL, 323 | NULL, 324 | Irp); 325 | if (Status == STATUS_PENDING) { 326 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 327 | Status = Irp->IoStatus.Status; 328 | } 329 | 330 | WskSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 331 | 332 | IoFreeIrp(Irp); 333 | return WskSocket; 334 | } 335 | 336 | NTSTATUS 337 | NTAPI 338 | DisConnect( 339 | PWSK_SOCKET WskSocket 340 | ) 341 | { 342 | KEVENT CompletionEvent = { 0 }; 343 | PIRP Irp = NULL; 344 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 345 | 346 | if (WskSocket == NULL) { 347 | return Status; 348 | } 349 | Status = InitWskData(&Irp, &CompletionEvent); 350 | if (!NT_SUCCESS(Status)) { 351 | KdPrint(("Connect(): InitWskData() failed with status 0x%08X\n", Status)); 352 | return Status; 353 | } 354 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskDisconnect( 355 | WskSocket, 356 | NULL, 357 | 0, 358 | Irp); 359 | if (Status == STATUS_PENDING) { 360 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 361 | Status = Irp->IoStatus.Status; 362 | } 363 | 364 | IoFreeIrp(Irp); 365 | return Status; 366 | 367 | } 368 | 369 | LONG 370 | NTAPI 371 | Send( 372 | __in PWSK_SOCKET WskSocket, 373 | __in PVOID Buffer, 374 | __in ULONG BufferSize, 375 | __in ULONG Flags 376 | ) 377 | { 378 | KEVENT CompletionEvent = {0}; 379 | PIRP Irp = NULL; 380 | WSK_BUF WskBuffer = {0}; 381 | LONG BytesSent = SOCKET_ERROR; 382 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 383 | 384 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 385 | return SOCKET_ERROR; 386 | 387 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 388 | if (!NT_SUCCESS(Status)) { 389 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 390 | return SOCKET_ERROR; 391 | } 392 | 393 | Status = InitWskData(&Irp, &CompletionEvent); 394 | if (!NT_SUCCESS(Status)) { 395 | KdPrint(("Send(): InitWskData() failed with status 0x%08X\n", Status)); 396 | FreeWskBuffer(&WskBuffer); 397 | return SOCKET_ERROR; 398 | } 399 | 400 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskSend( 401 | WskSocket, 402 | &WskBuffer, 403 | Flags, 404 | Irp); 405 | if (Status == STATUS_PENDING) { 406 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 407 | Status = Irp->IoStatus.Status; 408 | } 409 | 410 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 411 | 412 | IoFreeIrp(Irp); 413 | FreeWskBuffer(&WskBuffer); 414 | return BytesSent; 415 | } 416 | 417 | LONG 418 | NTAPI 419 | SendTo( 420 | __in PWSK_SOCKET WskSocket, 421 | __in PVOID Buffer, 422 | __in ULONG BufferSize, 423 | __in_opt PSOCKADDR RemoteAddress 424 | ) 425 | { 426 | KEVENT CompletionEvent = {0}; 427 | PIRP Irp = NULL; 428 | WSK_BUF WskBuffer = {0}; 429 | LONG BytesSent = SOCKET_ERROR; 430 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 431 | 432 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 433 | return SOCKET_ERROR; 434 | 435 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 436 | if (!NT_SUCCESS(Status)) { 437 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 438 | return SOCKET_ERROR; 439 | } 440 | 441 | Status = InitWskData(&Irp, &CompletionEvent); 442 | if (!NT_SUCCESS(Status)) { 443 | KdPrint(("SendTo(): InitWskData() failed with status 0x%08X\n", Status)); 444 | FreeWskBuffer(&WskBuffer); 445 | return SOCKET_ERROR; 446 | } 447 | 448 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskSendTo( 449 | WskSocket, 450 | &WskBuffer, 451 | 0, 452 | RemoteAddress, 453 | 0, 454 | NULL, 455 | Irp); 456 | if (Status == STATUS_PENDING) { 457 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 458 | Status = Irp->IoStatus.Status; 459 | } 460 | 461 | BytesSent = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 462 | 463 | IoFreeIrp(Irp); 464 | FreeWskBuffer(&WskBuffer); 465 | return BytesSent; 466 | } 467 | 468 | LONG 469 | NTAPI 470 | Receive( 471 | __in PWSK_SOCKET WskSocket, 472 | __out PVOID Buffer, 473 | __in ULONG BufferSize, 474 | __in ULONG Flags 475 | ) 476 | { 477 | KEVENT CompletionEvent = {0}; 478 | PIRP Irp = NULL; 479 | WSK_BUF WskBuffer = {0}; 480 | LONG BytesReceived = SOCKET_ERROR; 481 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 482 | 483 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 484 | return SOCKET_ERROR; 485 | 486 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 487 | if (!NT_SUCCESS(Status)) { 488 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 489 | return SOCKET_ERROR; 490 | } 491 | 492 | Status = InitWskData(&Irp, &CompletionEvent); 493 | if (!NT_SUCCESS(Status)) { 494 | KdPrint(("Receive(): InitWskData() failed with status 0x%08X\n", Status)); 495 | FreeWskBuffer(&WskBuffer); 496 | return SOCKET_ERROR; 497 | } 498 | 499 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskReceive( 500 | WskSocket, 501 | &WskBuffer, 502 | Flags, 503 | Irp); 504 | if (Status == STATUS_PENDING) { 505 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 506 | Status = Irp->IoStatus.Status; 507 | } 508 | 509 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 510 | 511 | IoFreeIrp(Irp); 512 | FreeWskBuffer(&WskBuffer); 513 | return BytesReceived; 514 | } 515 | 516 | LONG 517 | NTAPI 518 | ReceiveFrom( 519 | __in PWSK_SOCKET WskSocket, 520 | __out PVOID Buffer, 521 | __in ULONG BufferSize, 522 | __out_opt PSOCKADDR RemoteAddress, 523 | __out_opt PULONG ControlFlags 524 | ) 525 | { 526 | KEVENT CompletionEvent = {0}; 527 | PIRP Irp = NULL; 528 | WSK_BUF WskBuffer = {0}; 529 | LONG BytesReceived = SOCKET_ERROR; 530 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 531 | 532 | if (g_SocketsState != INITIALIZED || !WskSocket || !Buffer || !BufferSize) 533 | return SOCKET_ERROR; 534 | 535 | Status = InitWskBuffer(Buffer, BufferSize, &WskBuffer); 536 | if (!NT_SUCCESS(Status)) { 537 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 538 | return SOCKET_ERROR; 539 | } 540 | 541 | Status = InitWskData(&Irp, &CompletionEvent); 542 | if (!NT_SUCCESS(Status)) { 543 | KdPrint(("ReceiveFrom(): InitWskData() failed with status 0x%08X\n", Status)); 544 | FreeWskBuffer(&WskBuffer); 545 | return SOCKET_ERROR; 546 | } 547 | 548 | Status = ((PWSK_PROVIDER_DATAGRAM_DISPATCH)WskSocket->Dispatch)->WskReceiveFrom( 549 | WskSocket, 550 | &WskBuffer, 551 | 0, 552 | RemoteAddress, 553 | 0, 554 | NULL, 555 | ControlFlags, 556 | Irp); 557 | if (Status == STATUS_PENDING) { 558 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 559 | Status = Irp->IoStatus.Status; 560 | } 561 | 562 | BytesReceived = NT_SUCCESS(Status) ? (LONG)Irp->IoStatus.Information : SOCKET_ERROR; 563 | 564 | IoFreeIrp(Irp); 565 | FreeWskBuffer(&WskBuffer); 566 | return BytesReceived; 567 | } 568 | 569 | NTSTATUS 570 | NTAPI 571 | Bind( 572 | __in PWSK_SOCKET WskSocket, 573 | __in PSOCKADDR LocalAddress 574 | ) 575 | { 576 | KEVENT CompletionEvent = {0}; 577 | PIRP Irp = NULL; 578 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 579 | 580 | if (g_SocketsState != INITIALIZED || !WskSocket || !LocalAddress) 581 | return STATUS_INVALID_PARAMETER; 582 | 583 | Status = InitWskData(&Irp, &CompletionEvent); 584 | if (!NT_SUCCESS(Status)) { 585 | KdPrint(("Bind(): InitWskData() failed with status 0x%08X\n", Status)); 586 | return Status; 587 | } 588 | 589 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskBind( 590 | WskSocket, 591 | LocalAddress, 592 | 0, 593 | Irp); 594 | if (Status == STATUS_PENDING) { 595 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 596 | Status = Irp->IoStatus.Status; 597 | } 598 | 599 | IoFreeIrp(Irp); 600 | return Status; 601 | } 602 | 603 | 604 | PWSK_SOCKET 605 | NTAPI 606 | Accept( 607 | __in PWSK_SOCKET WskSocket, 608 | __out_opt PSOCKADDR LocalAddress, 609 | __out_opt PSOCKADDR RemoteAddress 610 | ) 611 | { 612 | KEVENT CompletionEvent = {0}; 613 | PIRP Irp = NULL; 614 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 615 | PWSK_SOCKET AcceptedSocket = NULL; 616 | 617 | if (g_SocketsState != INITIALIZED || !WskSocket) 618 | return NULL; 619 | 620 | Status = InitWskData(&Irp, &CompletionEvent); 621 | if (!NT_SUCCESS(Status)) { 622 | KdPrint(("Accept(): InitWskData() failed with status 0x%08X\n", Status)); 623 | return NULL; 624 | } 625 | 626 | Status = ((PWSK_PROVIDER_LISTEN_DISPATCH)WskSocket->Dispatch)->WskAccept( 627 | WskSocket, 628 | 0, 629 | NULL, 630 | NULL, 631 | LocalAddress, 632 | RemoteAddress, 633 | Irp); 634 | if (Status == STATUS_PENDING) { 635 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 636 | Status = Irp->IoStatus.Status; 637 | } 638 | 639 | AcceptedSocket = NT_SUCCESS(Status) ? (PWSK_SOCKET)Irp->IoStatus.Information : NULL; 640 | 641 | IoFreeIrp(Irp); 642 | return AcceptedSocket; 643 | } 644 | 645 | NTSTATUS 646 | NTAPI 647 | GetRemoteAddress( 648 | __in PWSK_SOCKET WskSocket, 649 | __out PSOCKADDR pRemoteAddress 650 | ) 651 | { 652 | KEVENT CompletionEvent = { 0 }; 653 | PIRP Irp = NULL; 654 | NTSTATUS Status = STATUS_UNSUCCESSFUL; 655 | 656 | Status = InitWskData(&Irp, &CompletionEvent); 657 | if (!NT_SUCCESS(Status)) { 658 | return SOCKET_ERROR; 659 | } 660 | 661 | Status = ((PWSK_PROVIDER_CONNECTION_DISPATCH)WskSocket->Dispatch)->WskGetRemoteAddress(WskSocket, pRemoteAddress, Irp); 662 | if (Status != STATUS_SUCCESS) 663 | { 664 | if (Status == STATUS_PENDING) { 665 | KeWaitForSingleObject(&CompletionEvent, Executive, KernelMode, FALSE, NULL); 666 | Status = Irp->IoStatus.Status; 667 | } 668 | 669 | if (Status != STATUS_SUCCESS) 670 | { 671 | if (Status != STATUS_INVALID_DEVICE_STATE) 672 | { 673 | //WDRBD_TRACE("STATUS_INVALID_DEVICE_STATE....\n"); 674 | } 675 | else if (Status != STATUS_FILE_FORCED_CLOSED) 676 | { 677 | //WDRBD_TRACE("STATUS_FILE_FORCED_CLOSED....\n"); 678 | } 679 | else 680 | { 681 | //WDRBD_TRACE("0x%x....\n", Status); 682 | } 683 | } 684 | } 685 | IoFreeIrp(Irp); 686 | return Status; 687 | } --------------------------------------------------------------------------------