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; 
}