windows-nt/Source/XPSP1/NT/net/tcpip/tools/ipfw/ipfwc.c
2020-09-26 16:20:57 +08:00

160 lines
4.7 KiB
C

/*++
Copyright (c) 2000, Microsoft Corporation
Module Name:
ipfwc.c
Abstract:
This module contains the control-program for the IP firewall hook
test driver.
Author:
Abolade Gbadegesin (aboladeg) 7-March-2000
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "ipfw.h"
typedef struct _IPFWC_ENTRY {
HANDLE FileHandle;
ULONG Priority;
ULONG Flags;
} IPFWC_ENTRY, *PIPFWC_ENTRY;
#define IPFWC_ENTRY_FLAG_REGISTERED 0x00000001
IPFWC_ENTRY EntryTable[IPFW_ROUTINE_COUNT];
int __cdecl
main(
int argc,
char* argv[]
)
{
ULONG i;
ULONG Selection;
//
// Enter a loop where we prompt the user to either register or deregister
// a firewall hook with a specified priority.
//
ZeroMemory(EntryTable, sizeof(EntryTable));
for (;;) {
for (i = 0; i < IPFW_ROUTINE_COUNT; i++) {
if (EntryTable[i].Flags & IPFWC_ENTRY_FLAG_REGISTERED) {
printf("\tEntry %d Priority %d\n", i, EntryTable[i].Priority);
}
}
printf("1. Register new entry.\n");
printf("2. Deregister existing entry.\n");
printf("3. Quit.\n");
printf("Enter selection:");
if (!scanf("%d", &Selection)) { break; }
switch(Selection) {
case 1: {
UCHAR Buffer[512];
PIPFW_CREATE_PACKET CreatePacket;
PFILE_FULL_EA_INFORMATION EaBuffer;
ULONG EaBufferLength;
IO_STATUS_BLOCK IoStatus;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS status;
UNICODE_STRING UnicodeString;
for (i = 0; i < IPFW_ROUTINE_COUNT; i++) {
if (!(EntryTable[i].Flags & IPFWC_ENTRY_FLAG_REGISTERED)) {
break;
}
}
if (i >= IPFW_ROUTINE_COUNT) {
printf("No entries available.\n");
break;
}
printf("Enter priority: ");
if (!scanf("%d", &EntryTable[i].Priority)) { break; }
if (!EntryTable[i].Priority) {
printf("Invalid priority.\n");
break;
}
EaBuffer = (PFILE_FULL_EA_INFORMATION)Buffer;
EaBufferLength =
sizeof(FILE_FULL_EA_INFORMATION) +
IPFW_CREATE_NAME_LENGTH + sizeof(IPFW_CREATE_PACKET);
EaBuffer->NextEntryOffset = 0;
EaBuffer->Flags = 0;
EaBuffer->EaNameLength = IPFW_CREATE_NAME_LENGTH;
CopyMemory(
EaBuffer->EaName, IPFW_CREATE_NAME,
IPFW_CREATE_NAME_LENGTH + 1
);
EaBuffer->EaValueLength = sizeof(IPFW_CREATE_PACKET);
CreatePacket =
(PIPFW_CREATE_PACKET)
(EaBuffer->EaName + EaBuffer->EaNameLength + 1);
CreatePacket->Priority = EntryTable[i].Priority;
RtlInitUnicodeString(&UnicodeString, DD_IPFW_DEVICE_NAME);
InitializeObjectAttributes(
&ObjectAttributes, &UnicodeString, OBJ_CASE_INSENSITIVE,
NULL, NULL
);
status =
NtCreateFile(
&EntryTable[i].FileHandle,
GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,
&ObjectAttributes,
&IoStatus,
NULL,
0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
FILE_OPEN_IF,
0,
EaBuffer,
EaBufferLength
);
if (!NT_SUCCESS(status)) {
printf("Registration failed (status=%x).\n", status);
} else {
EntryTable[i].Flags |= IPFWC_ENTRY_FLAG_REGISTERED;
}
break;
}
case 2: {
printf("Enter entry index: ");
if (!scanf("%d", &i)) { break; }
if (i >= IPFW_ROUTINE_COUNT) {
printf("Invalid entry index.\n");
break;
}
EntryTable[i].Flags &= ~IPFWC_ENTRY_FLAG_REGISTERED;
NtClose(EntryTable[i].FileHandle);
break;
}
case 3: {
return 0;
}
default:
printf("Invalid selection.\n");
break;
}
}
return 0;
}