Example #1
0
/*++
* @method: GetListCount
*
* @description: Gets the number of elements in a specified type of list
*
* @input: eListType eTypeOfList
*
* @output: UINT
*
*--*/
UINT GetListCount( eListType eTypeOfList )
{
    UINT nCnt = 0;
    __try
    {
        // Get the count by looping through the list
        PVOID pItem = NULL;
        while( STATUS_SUCCESS == GetListEntry( eTypeOfList, nCnt, &pItem ) )
        {
            ++nCnt;
        }
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        DbgPrint( "Exception caught in GetListCount()" );
        nCnt = 0;
    }
    return nCnt;
}
Example #2
0
static void ProcessVoxelMeshes( ChunkEnvironment* env )
{
    const int w = env->w-2;
    const int h = env->h-2;
    const int d = env->d-2;

    const float hw = ((float)w) / 2.f;
    const float hh = ((float)h) / 2.f;
    const float hd = ((float)d) / 2.f;

    for(int z = 0; z < d; z++)
    for(int y = 0; y < h; y++)
    for(int x = 0; x < w; x++)
    {
        const int envIndex = Get3DArrayIndex(x+1,
                                             y+1,
                                             z+1,
                                             env->w,
                                             env->h,
                                             env->d);
        const int transparentNeighbors = env->transparentNeighbors[envIndex];
        List* meshList = env->meshLists[envIndex];

        const int meshCount = GetListLength(meshList);
        for(int i = 0; i < meshCount; i++)
        {
            const VoxelMesh* mesh = *(VoxelMesh**)GetListEntry(meshList, i);
            const float xTranslation = ((float)x) - hw + 0.5f;
            const float yTranslation = ((float)y) - hh + 0.5f;
            const float zTranslation = ((float)z) - hd + 0.5f;
            ProcessVoxelMesh(env,
                             transparentNeighbors,
                             xTranslation,
                             yTranslation,
                             zTranslation,
                             mesh);
        }
    }
}
Example #3
0
/*++
* @method: FindEntry
*
* @description: Finds a specified item in specified list
*
* @input: eListType eTypeOfList, PVOID pItemToFind
*
* @output: NTSTATUS
*
*--*/
NTSTATUS FindEntry( eListType eTypeOfList, PVOID pItemToFind )
{
    NTSTATUS retVal = STATUS_UNSUCCESSFUL;
    __try
    {
        UINT i = 0;
        PVOID pCurrent = NULL;

        if( pItemToFind )
        {
            // Loop through the list to find required entry
            while( STATUS_SUCCESS == GetListEntry( eTypeOfList, i, &pCurrent ) )
            {
                ++i;
                if( pCurrent )
                {
                    switch( eTypeOfList )
                    {
                    case eProcList:
                        {
                            if( ((PPROCLISTENTRY)pCurrent)->dwPID == ((PPROCLISTENTRY)pItemToFind)->dwPID )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;

                    case eDllList:
                        {
                            if( ((PDLLLISTENTRY)pCurrent)->dwBase == ((PDLLLISTENTRY)pItemToFind)->dwBase )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;

                    case eDrvList:
                        {
                            if( ((PDRIVERLISTENTRY)pCurrent)->dwBase == ((PDRIVERLISTENTRY)pItemToFind)->dwBase )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;

                    case eSsdtList:
                        {
                            if( ((PSSDTHOOKLISTENTRY)pCurrent)->dwHookAddr == ((PSSDTHOOKLISTENTRY)pItemToFind)->dwHookAddr )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;

                    default:
                        {
                            retVal = STATUS_UNSUCCESSFUL;
                        }
                        break;
                    }
                }
                else
                {
                    break;
                }

                // Found entry
                if( STATUS_SUCCESS == retVal )
                {
                    break;
                }
            }
        }
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        DbgPrint( "Exception caught in FindEntry()" );
        retVal = STATUS_UNSUCCESSFUL;
    }
    return retVal;
}
Example #4
0
/*++
* @method: DrvDispatch
*
* @description: IOCTL dispatch routine
*
* @input: IN PDEVICE_OBJECT pDevice, IN PIRP pIrp
*
* @output: NTSTATUS
*
*--*/
NTSTATUS DrvDispatch( IN PDEVICE_OBJECT pDevice, IN PIRP pIrp )
{
    NTSTATUS retVal = STATUS_UNSUCCESSFUL;
    
    __try
    {
        UINT nIndex = 0;
        DWORD dwInBuffSize = 0;
        DWORD dwOutBuffSize = 0;
        PIO_STACK_LOCATION pIoStackIrp = NULL;

        if( MmIsAddressValid( pIrp ) )
        {
            pIoStackIrp = IoGetCurrentIrpStackLocation( pIrp );
        }

        if( MmIsAddressValid( pIoStackIrp ) )
        {
            dwInBuffSize = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength;
            dwOutBuffSize = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength;
        }

        switch( pIoStackIrp->Parameters.DeviceIoControl.IoControlCode )
        {
        case IOCTL_OS_VER_INFO:
            {
                // Set OS and SP versions got from usermode, in our globals
                PMYOSVERINFO pOSVerInfo = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pOSVerInfo ) )
                {
                    if( STATUS_SUCCESS == InitGlobals( pOSVerInfo ) )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwInBuffSize;
                    }
                }
            }
            break;

        case IOCTL_GET_DATA_CNT:
            {
                // Get the count of items requested by usermode
                PARKDATACOUNT pArkDataCout = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pArkDataCout ) )
                {
                    switch( pArkDataCout->typeOfArkData )
                    {
                    case eArkDataProcList:
                        {
                            // Get the count of running processes
                            pArkDataCout->dataCount = ScanAndGetProcessCount();
                        }
                        break;

                    case eArkDataDllList:
                        {
                            // Get the count of DLLs
                            pArkDataCout->dataCount = ScanAndGetDllCount( pArkDataCout->miscData );
                        }
                        break;

                    case eArkDataDriverList:
                        {
                            // Get the count of loaded drivers
                            pArkDataCout->dataCount = ScanAndGetDriverCount();
                        }
                        break;

                    case eArkDataSsdtList:
                        {
                            // Get the count of SSDT hooks
                            pArkDataCout->dataCount = ScanAndGetSSDTHooksCount();
                        }
                        break;

                    default:
                        {
                            pArkDataCout->dataCount = 0;
                        }
                        break;
                    }

                    // Set the IO status based on count of items
                    if( pArkDataCout->dataCount > 0 )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = sizeof( ARKDATACOUNT );
                    }
                }
            }
            break;

        case IOCTL_GET_PROCESS:
            {
                // Copy all processes info from our internal list to usermode array
                PARKPROCESS pArkProcData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pArkProcData ) && VALIDATE_LIST_BUFF_SIZE( dwOutBuffSize, ARKPROCESS, eProcList ) )
                {
                    PPROCLISTENTRY pProcListEntry = NULL;
                    while( STATUS_SUCCESS == GetListEntry( eProcList, nIndex, &pProcListEntry ) )
                    {
                        if( MmIsAddressValid( pProcListEntry ) )
                        {
                            pArkProcData[nIndex].procId = pProcListEntry->dwPID;
                            RtlStringCchCopyA( pArkProcData[nIndex].procName, ARKITLIB_STR_LEN, pProcListEntry->szProcName );
                            ++nIndex;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if( nIndex > 0 )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwOutBuffSize;
                    }
                }
                // Free our internal process list
                DelList( eProcList );
            }
            break;

        case IOCTL_GET_DLLS:
            {
                // Copy all DLLs info from our internal list to usermode array
                PARKDLL pArkDllData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pArkDllData ) && VALIDATE_LIST_BUFF_SIZE( dwOutBuffSize, ARKDLL, eDllList ) )
                {
                    PDLLLISTENTRY pDllListEntry = NULL;
                    while( STATUS_SUCCESS == GetListEntry( eDllList, nIndex, &pDllListEntry ) )
                    {
                        if( MmIsAddressValid( pDllListEntry ) )
                        {
                            pArkDllData[nIndex].baseAddr = pDllListEntry->dwBase;
                            RtlStringCchCopyA( pArkDllData[nIndex].dllName, ARKITLIB_STR_LEN, pDllListEntry->szDllName );
                            ++nIndex;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if( nIndex > 0 )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwOutBuffSize;
                    }
                }
                // Free our internal DLL list
                DelList( eDllList );
            }
            break;

        case IOCTL_GET_DRIVERS:
            {
                // Copy all drivers info from our internal list to usermode array
                PARKDRIVER pArkDrvData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pArkDrvData ) && VALIDATE_LIST_BUFF_SIZE( dwOutBuffSize, ARKDRIVER, eDrvList ) )
                {
                    PDRIVERLISTENTRY pDrvListEntry = NULL;
                    while( STATUS_SUCCESS == GetListEntry( eDrvList, nIndex, &pDrvListEntry ) )
                    {
                        if( MmIsAddressValid( pDrvListEntry ) )
                        {
                            pArkDrvData[nIndex].baseAddr = pDrvListEntry->dwBase;
                            pArkDrvData[nIndex].endAddr = pDrvListEntry->dwEnd;
                            pArkDrvData[nIndex].entryPoint = pDrvListEntry->dwEntryPoint;
                            RtlStringCchCopyA( pArkDrvData[nIndex].driverName, ARKITLIB_STR_LEN, pDrvListEntry->szDrvName );
                            ++nIndex;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if( nIndex > 0 )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwOutBuffSize;
                    }
                }
                // Free our internal driver list
                DelList( eDrvList );
            }
            break;

        case IOCTL_GET_SSDTHOOKS:
            {
                // Copy all SSDT hooks info from our internal list to usermode array
                PARKSSDTHOOK pArkSsdtData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pArkSsdtData ) && VALIDATE_LIST_BUFF_SIZE( dwOutBuffSize, ARKSSDTHOOK, eSsdtList ) )
                {
                    PSSDTHOOKLISTENTRY pSsdtListEntry = NULL;
                    while( STATUS_SUCCESS == GetListEntry( eSsdtList, nIndex, &pSsdtListEntry ) )
                    {
                        if( MmIsAddressValid( pSsdtListEntry ) )
                        {
                            pArkSsdtData[nIndex].unSsdtIndex = pSsdtListEntry->unIndex;
                            pArkSsdtData[nIndex].baseAddr = pSsdtListEntry->dwBase;
                            pArkSsdtData[nIndex].endAddr = pSsdtListEntry->dwEnd;
                            pArkSsdtData[nIndex].hookAddr = pSsdtListEntry->dwHookAddr;
                            RtlStringCchCopyA( pArkSsdtData[nIndex].driverName, ARKITLIB_STR_LEN, pSsdtListEntry->szDrvName );
                            ++nIndex;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if( nIndex > 0 )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwOutBuffSize;
                    }
                }
                // Free our internal driver and SSDT list
                DelList( eDrvList );
                DelList( eSsdtList );
            }
            break;

        case IOCTL_GET_SYSENTERHOOK:
            {
                // Copy sysenter hook data to usermode buffer
                PARKSYSENTERHOOK pSysenterHookData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pSysenterHookData ) )
                {
                    if( ScanAndGetSysenterHook( pSysenterHookData ) )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwOutBuffSize;
                    }
                }

                // Free driver list
                DelList( eDrvList );
            }
            break;

        case IOCTL_GET_KINLINEHOOK:
            {
                PARKINLINEHOOK pKernelFuncData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pKernelFuncData ) )
                {
                    if( ScanFunctionInlineHook( pKernelFuncData ) )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwOutBuffSize;
                    }
                }
            }
            break;

        case IOCTL_NT_API_INFO:
            {
                PARKNTAPI pNtApiData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pNtApiData ) )
                {
                    if( STATUS_SUCCESS == InitNtApiData( pNtApiData ) )
                    {
                        retVal = STATUS_SUCCESS;
                        pIrp->IoStatus.Information = dwInBuffSize;
                    }
                }
            }
            break;

        case IOCTL_FIX_ISSUES:
            {
                PARKFIX pFixData = pIrp->AssociatedIrp.SystemBuffer;
                if( MmIsAddressValid( pFixData ) )
                {
                    switch( pFixData->eType )
                    {
                    case eArkKillProcess:
                        {
                            PDWORD pdwPid = (PDWORD)(pFixData->cFixData);
                            if( KillProcess( pdwPid ) )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;

                    case eArkFixSsdtHook:
                        {
                            PARKFIXSSDT pFixSsdtHookData = (PARKFIXSSDT)(pFixData->cFixData);
                            if( FixSSDTHook( pFixSsdtHookData ) )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;

                    case eArkFixInlineHook:
                        {
                            PARKFIXINLINEHOOK pFixInlineHook = (PARKFIXINLINEHOOK)(pFixData->cFixData);
                            if( FixInlineHook( pFixInlineHook ) )
                            {
                                retVal = STATUS_SUCCESS;
                            }
                        }
                        break;
                    }

                    if( STATUS_SUCCESS == retVal )
                    {
                        pIrp->IoStatus.Information = dwInBuffSize;
                    }
                }
            }
            break;

        default:
            {
                retVal = STATUS_UNSUCCESSFUL;
                pIrp->IoStatus.Information = 0;
            }
            break;
        }
        pIrp->IoStatus.Status = retVal;
        IoCompleteRequest( pIrp, IO_NO_INCREMENT );
    }
    __except( EXCEPTION_EXECUTE_HANDLER )
    {
        retVal = STATUS_UNSUCCESSFUL;
        DbgPrint( "Exception caught in DrvDispatch()" );
    }
    return retVal;
}