BSOne.SFC/Tocsg.Module/Bs1Flt/bs1flt/bs1flt_pg.c

194 lines
4.2 KiB
C

#include "precomp.h"
static KSPIN_LOCK s_lock;
//#define PID_MAP
static ULONG s_allowPids[1024];
static ULONG s_denyPids[1024];
//static ULONG s_protectedPids[512];
static ULONG s_whitePids[1024];
static ULONG s_greenPids[1024];
static ULONG s_protectPids[1024];
static void SetPidBitInMap(ULONG* m, ULONG pid)
{
ULONG rpid = (ULONG)(pid & 0xffffff) >> 2;
ULONG i = rpid >> 5;
ULONG r = rpid & 0x1f;
ULONG mask = 1 << (31 - r);
m[i] |= mask;
}
static ULONG GetPidBitInMap(ULONG* m, ULONG pid)
{
ULONG p = (ULONG)(pid & 0xffffff) >> 2;
ULONG i = p >> 5;
ULONG r = p & 0x1f;
ULONG q = m[i] << r;
return q & 0x80000000;
}
static void ClearPidBitInMap(ULONG* m, ULONG pid)
{
ULONG rpid = (ULONG)(pid & 0xffffff) >> 2;
ULONG i = rpid >> 5;
ULONG r = rpid & 0x1f;
ULONG mask = 1 << (31 - r);
m[i] &= ~mask;
}
void PgInitialize()
{
KeInitializeSpinLock(&s_lock);
RtlZeroMemory(s_allowPids, sizeof(s_allowPids));
RtlZeroMemory(s_whitePids, sizeof(s_whitePids));
RtlZeroMemory(s_greenPids, sizeof(s_greenPids));
RtlZeroMemory(s_denyPids, sizeof(s_denyPids));
RtlZeroMemory(s_protectPids, sizeof(s_denyPids));
}
void PgCleanup()
{
}
void PgReset()
{
KIRQL irql;
KeAcquireSpinLock(&s_lock, &irql);
RtlZeroMemory(s_allowPids, sizeof(s_allowPids));
RtlZeroMemory(s_whitePids, sizeof(s_whitePids));
RtlZeroMemory(s_greenPids, sizeof(s_greenPids));
RtlZeroMemory(s_denyPids, sizeof(s_denyPids));
RtlZeroMemory(s_protectPids, sizeof(s_denyPids));
KeReleaseSpinLock(&s_lock, irql);
}
void PgResetState(ULONG state)
{
KIRQL irql;
KeAcquireSpinLock(&s_lock, &irql);
if (state == PG_PID_ALLOW)
RtlZeroMemory(s_allowPids, sizeof(s_allowPids));
if (state == PG_PID_WHITE)
RtlZeroMemory(s_whitePids, sizeof(s_whitePids));
if (state == PG_PID_GREEN)
RtlZeroMemory(s_greenPids, sizeof(s_greenPids));
if (state == PG_PID_BLACK)
RtlZeroMemory(s_denyPids, sizeof(s_denyPids));
if (state == PG_PID_PROTECT)
RtlZeroMemory(s_protectPids, sizeof(s_denyPids));
KeReleaseSpinLock(&s_lock, irql);
}
void PgAddPid(ULONG pid, ULONG state)
{
KIRQL irql;
//KLogEx("%d %d\n", pid, state);
KeAcquireSpinLock(&s_lock, &irql);
if (state == PG_PID_ALLOW)
SetPidBitInMap(s_allowPids, pid);
if (state == PG_PID_WHITE)
SetPidBitInMap(s_whitePids, pid);
if (state == PG_PID_GREEN)
SetPidBitInMap(s_greenPids, pid);
if (state == PG_PID_BLACK)
SetPidBitInMap(s_denyPids, pid);
if( state == PG_PID_PROTECT)
SetPidBitInMap(s_protectPids, pid);
KeReleaseSpinLock(&s_lock, irql);
KLogEx(DEBUG_TRACE_INFO, "%d %d COMPLETE\n", pid, state);
}
ULONG PgRemovePid(ULONG pid)
{
KIRQL irql;
ULONG state = PgGetPidState(pid);
KLogEx(DEBUG_TRACE_INFO, "PgRemove %d %d\n", pid, state);
KeAcquireSpinLock(&s_lock, &irql);
ClearPidBitInMap(s_allowPids, pid);
ClearPidBitInMap(s_whitePids, pid);
ClearPidBitInMap(s_greenPids, pid);
ClearPidBitInMap(s_denyPids, pid);
ClearPidBitInMap(s_protectPids, pid);
KeReleaseSpinLock(&s_lock, irql);
return state;
}
ULONG PgRemovePidState(ULONG pid, ULONG state)
{
KIRQL irql;
KLogEx(DEBUG_TRACE_INFO, "%d %d\n", pid, state);
KeAcquireSpinLock(&s_lock, &irql);
if (state == PG_PID_ALLOW)
ClearPidBitInMap(s_allowPids, pid);
if (state == PG_PID_WHITE)
ClearPidBitInMap(s_whitePids, pid);
if (state == PG_PID_GREEN)
ClearPidBitInMap(s_greenPids, pid);
if (state == PG_PID_BLACK)
ClearPidBitInMap(s_denyPids, pid);
if (state == PG_PID_PROTECT)
ClearPidBitInMap(s_protectPids, pid);
KeReleaseSpinLock(&s_lock, irql);
return state;
}
ULONG PgGetProtectPidState(ULONG pid)
{
KIRQL irql;
ULONG aState;
KeAcquireSpinLock(&s_lock, &irql);
aState = GetPidBitInMap(s_protectPids, pid);
KeReleaseSpinLock(&s_lock, irql);
if (aState)
return PG_PID_PROTECT;
return PG_PID_UNDEFINED;
}
ULONG PgGetPidState(ULONG pid)
{
KIRQL irql;
ULONG aState, wState, gstate, bstate;
KeAcquireSpinLock(&s_lock, &irql);
aState = GetPidBitInMap(s_allowPids, pid);
wState = GetPidBitInMap(s_whitePids, pid);
gstate = GetPidBitInMap(s_greenPids, pid);
bstate = GetPidBitInMap(s_denyPids, pid);
KeReleaseSpinLock(&s_lock, irql);
if (aState)
return PG_PID_ALLOW;
if (wState)
return PG_PID_WHITE;
if (gstate)
return PG_PID_GREEN;
if (bstate)
return PG_PID_BLACK;
return PG_PID_UNDEFINED;
}