Windows2003-3790/windows/appcompat/shims/specific/failsocket.cpp
2020-09-30 16:53:55 +02:00

196 lines
3.9 KiB
C++

/*++
Copyright (c) 2003 Microsoft Corporation. All rights reserved.
Module Name:
FailSocket.cpp
Abstract:
This shim fails the socket call. (Goodnight Gracie...)
Writes a message to the event log.
Notes:
This is a general purpose shim.
History:
01/30/2003 mnikkel, rparsons Created
02/21/2003 robkenny Second attempt, fail WSAStartup
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(FailSocket)
#include "ShimHookMacro.h"
#include "acmsg.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(WSAStartup)
APIHOOK_ENUM_ENTRY(WSACleanup)
APIHOOK_ENUM_ENTRY(WSAEnumProtocolsA)
APIHOOK_ENUM_ENTRY(socket)
APIHOOK_ENUM_END
//
// Contains the name of the source from the registry.
// This is passed on the command-line from the XML.
// It appears in the 'Source' column in the Event Viewer.
//
CString* g_pcsEventSourceName = NULL;
/*++
Responsible for making the actual entry in the event log.
--*/
void
MakeEventLogEntry(
void
)
{
HANDLE hEventLog = NULL;
BOOL bResult;
//
// Get a handle to the event log on the local computer.
//
hEventLog = RegisterEventSource(NULL, g_pcsEventSourceName->Get());
if (NULL == hEventLog) {
LOGN(eDbgLevelError,
"[MakeEventLogEntry] 0x%08X Failed to register event source",
GetLastError());
goto cleanup;
}
//
// Write the event to the event log.
//
bResult = ReportEvent(hEventLog,
EVENTLOG_INFORMATION_TYPE,
0,
ID_SQL_PORTS_DISABLED,
NULL,
0,
0,
NULL,
NULL);
if (!bResult) {
LOGN(eDbgLevelError,
"[MakeEventLogEntry] 0x%08X Failed to make event log entry",
GetLastError());
goto cleanup;
}
cleanup:
if (hEventLog) {
DeregisterEventSource(hEventLog);
hEventLog = NULL;
}
}
// Tell the app that there are no protocols available.
int
APIHOOK(WSAEnumProtocolsA)(
LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
LPDWORD lpdwBufferLength
)
{
if (lpProtocolBuffer == NULL && lpiProtocols == NULL)
{
*lpdwBufferLength = 1; // SSnetlib.dll will allocate this much data for the struct
}
else
{
MakeEventLogEntry();
}
// There are not protocols available.
LOGN(eDbgLevelError, "WSAEnumProtocolsA returning 0");
return 0;
}
// Noop the call to WSAStartup, but return success
int
APIHOOK(WSAStartup)(
WORD wVersionRequested,
LPWSADATA lpWSAData
)
{
MakeEventLogEntry();
LOGN(eDbgLevelError, "WSAStartup call has been prevented");
return 0;
}
// Since we noop WSAStartup, we must noop WSACleanup
int
APIHOOK(WSACleanup) (void)
{
return 0;
}
SOCKET
APIHOOK(socket)(
int af,
int type,
int protocol
)
{
LOGN(eDbgLevelError,
"Failing socket call: af = %d type = %d protocol = %d",
af,
type,
protocol);
MakeEventLogEntry();
WSASetLastError(WSAENETDOWN);
return INVALID_SOCKET;
}
/*++
Register hooked functions
--*/
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason
)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
CSTRING_TRY
{
g_pcsEventSourceName = new CString(COMMAND_LINE);
}
CSTRING_CATCH
{
return FALSE;
}
}
return TRUE;
}
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(WSOCK32.DLL, socket)
APIHOOK_ENTRY(Wsock32.DLL, WSAStartup)
APIHOOK_ENTRY(Wsock32.DLL, WSACleanup)
APIHOOK_ENTRY(Ws2_32.DLL, WSAEnumProtocolsA)
HOOK_END
IMPLEMENT_SHIM_END