Author: cgutman Date: Thu May 6 01:06:32 2010 New Revision: 47108
URL: http://svn.reactos.org/svn/reactos?rev=47108&view=rev Log: [NTOSKRNL] - Implement Ke386IoSetAccessProcess, Ke386SetIoAccessMap, and Ke386QueryIoAccessMap [NDK] - Add definition of KIO_ACCESS_MAP
- Patch by Samuel Serapion - Fixes bug 2641
Modified: trunk/reactos/include/ndk/i386/ketypes.h trunk/reactos/ntoskrnl/ke/i386/v86vdm.c
Modified: trunk/reactos/include/ndk/i386/ketypes.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/i386/ketypes.h?... ============================================================================== --- trunk/reactos/include/ndk/i386/ketypes.h [iso-8859-1] (original) +++ trunk/reactos/include/ndk/i386/ketypes.h [iso-8859-1] Thu May 6 01:06:32 2010 @@ -150,6 +150,10 @@ (MapNumber == IO_ACCESS_MAP_NONE) ? \ (USHORT)(sizeof(KTSS)) : \ (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap)) + +typedef UCHAR KIO_ACCESS_MAP[IOPM_SIZE]; + +typedef KIO_ACCESS_MAP *PKIO_ACCESS_MAP;
// // Size of the XMM register save area in the FXSAVE format
Modified: trunk/reactos/ntoskrnl/ke/i386/v86vdm.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/v86vdm.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/v86vdm.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/v86vdm.c [iso-8859-1] Thu May 6 01:06:32 2010 @@ -659,37 +659,87 @@ }
/* - * @unimplemented + * @implemented */ BOOLEAN NTAPI Ke386IoSetAccessProcess(IN PKPROCESS Process, - IN ULONG Flag) -{ - UNIMPLEMENTED; - return FALSE; + IN ULONG MapNumber) +{ + USHORT MapOffset; + PKPRCB Prcb; + KAFFINITY TargetProcessors; + + if(MapNumber > IOPM_COUNT) + return FALSE; + + MapOffset = KiComputeIopmOffset(MapNumber); + + Process->IopmOffset = MapOffset; + + TargetProcessors = Process->ActiveProcessors; + Prcb = KeGetCurrentPrcb(); + if (TargetProcessors & Prcb->SetMember) + KeGetPcr()->TSS->IoMapBase = MapOffset; + + return TRUE; }
/* - * @unimplemented + * @implemented */ BOOLEAN NTAPI -Ke386SetIoAccessMap(IN ULONG Flag, - IN PVOID IopmBuffer) -{ - UNIMPLEMENTED; - return FALSE; +Ke386SetIoAccessMap(IN ULONG MapNumber, + IN PKIO_ACCESS_MAP IopmBuffer) +{ + PKPROCESS CurrentProcess; + PKPRCB Prcb; + PVOID pt; + + if ((MapNumber > IOPM_COUNT) || (MapNumber == IO_ACCESS_MAP_NONE)) + return FALSE; + + Prcb = KeGetCurrentPrcb(); + + // Copy the IOP map and load the map for the current process. + pt = &(KeGetPcr()->TSS->IoMaps[MapNumber-1].IoMap); + RtlMoveMemory(pt, (PVOID)IopmBuffer, IOPM_SIZE); + CurrentProcess = Prcb->CurrentThread->ApcState.Process; + KeGetPcr()->TSS->IoMapBase = CurrentProcess->IopmOffset; + + return TRUE; }
/* - * @unimplemented + * @implemented */ BOOLEAN NTAPI -Ke386QueryIoAccessMap(IN ULONG Flag, - IN PVOID IopmBuffer) -{ - UNIMPLEMENTED; - return FALSE; -} +Ke386QueryIoAccessMap(IN ULONG MapNumber, + IN PKIO_ACCESS_MAP IopmBuffer) +{ + ULONG i; + PVOID Map; + PUCHAR p; + + if (MapNumber > IOPM_COUNT) + return FALSE; + + if (MapNumber == IO_ACCESS_MAP_NONE) + { + // no access, simply return a map of all 1s + p = (PUCHAR)IopmBuffer; + for (i = 0; i < IOPM_SIZE; i++) { + p[i] = (UCHAR)-1; + } + } + else + { + // copy the bits + Map = (PVOID)&(KeGetPcr()->TSS->IoMaps[MapNumber-1].IoMap); + RtlMoveMemory((PVOID)IopmBuffer, Map, IOPM_SIZE); + } + + return TRUE; +}