www.pudn.com > tdi_fw.zip > ipc.c
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs) // // $Id: ipc.c,v 1.2 2002/12/03 12:14:27 dev Exp $ /* * This file contain replaced TDI_EVENT_CONNECT handler */ #include#include "sock.h" #include "filter.h" #include "ipc.h" NTSTATUS process_request(ULONG code, char *buf, ULONG *buf_len, ULONG buf_size) { NTSTATUS status; ULONG len = *buf_len; *buf_len = 0; switch (code) { case IOCTL_CMD_GETREQUEST: // get data for logging if (buf_size < sizeof(struct flt_request) || buf == NULL) { status = STATUS_INFO_LENGTH_MISMATCH; break; } *buf_len = get_request(buf, buf_size); status = STATUS_SUCCESS; break; case IOCTL_CMD_CLEARCHAIN: // clear rules chain #i if (len != sizeof(int) || buf == NULL) { status = STATUS_INFO_LENGTH_MISMATCH; break; } status = clear_flt_chain(*(int *)buf); break; case IOCTL_CMD_APPENDRULE: // append rule to chain #i if (len != sizeof(struct flt_rule) || buf == NULL) { status = STATUS_INFO_LENGTH_MISMATCH; break; } status = add_flt_rule(((struct flt_rule *)buf)->chain, (struct flt_rule *)buf); break; case IOCTL_CMD_SETCHAINPNAME: // set chain #i process name if (len < sizeof(int) + sizeof(char) || buf == NULL) { status = STATUS_INFO_LENGTH_MISMATCH; break; } if (buf[len - 1] != '\0') { status = STATUS_INVALID_PARAMETER; // string must be zero-terminated break; } status = set_chain_pname(*(int *)buf, buf + sizeof(int)); break; case IOCTL_CMD_SETPNAME: // set process name for pid if (len < sizeof(ULONG) + sizeof(char) || buf == NULL) { status = STATUS_INFO_LENGTH_MISMATCH; break; } if (buf[len - 1] != '\0') { status = STATUS_INVALID_PARAMETER; // string must be zero-terminated break; } status = set_pid_pname(*(ULONG *)buf, buf + sizeof(ULONG)); break; default: status = STATUS_NOT_SUPPORTED; } return status; }