2.1.ReactOS系统NtReadFile函数的实现。

ReactOS系统NtReadFile函数的实现。

ReactOS系统NtReadFile函数的实现。


NtReadFile()是windows的一个系统调用,内核中有一个叫NtReadFile的函数

NtReadFile函数的定义

NTSTATUS  WINAPI NtReadFile(
						HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,
						PIO_STATUS_BLOCK,PVOID,ULONG,PLARGE_INTEGER,PULONG);

上面的函数看起来很费解。
我们用另外一个函数来看
在这里插入图片描述
这里涉及到内核的快速调用的知识。
eax,0B7h:系统调用号:指向NtReadFile(xxxxxxxxx)函数
edx,7ffe0300h:系统调用函数的地址

这样之后就实现了。R3与R0的隔离

NtReadFile函数的实现

NTSTATUS
NTAPI
NtReadFile(IN HANDLE FileHandle,
           IN HANDLE Event OPTIONAL,
           IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
           IN PVOID ApcContext OPTIONAL,
           OUT PIO_STATUS_BLOCK IoStatusBlock,
           OUT PVOID Buffer,
           IN ULONG Length,
           IN PLARGE_INTEGER ByteOffset OPTIONAL,
           IN PULONG Key OPTIONAL)
{
   
   
    NTSTATUS Status = STATUS_SUCCESS;
    PFILE_OBJECT FileObject;
    PIRP Irp;
    PDEVICE_OBJECT DeviceObject;
    PIO_STACK_LOCATION StackPtr;
    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
    PKEVENT EventObject = NULL;
    LARGE_INTEGER CapturedByteOffset;
    ULONG CapturedKey = 0;
    BOOLEAN Synchronous = FALSE;
    PMDL Mdl;
    PAGED_CODE();
    CapturedByteOffset.QuadPart = 0;
    IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);

    /* Validate User-Mode Buffers */
    if(PreviousMode != KernelMode)
    {
   
   
        _SEH_TRY
        {
   
   
            /* Probe the status block */
            ProbeForWriteIoStatusBlock(IoStatusBlock);

            /* Probe the read buffer */
            ProbeForWrite(Buffer, Length, 1);

            /* Check if we got a byte offset */
            if (ByteOffset)
            {
   
   
                /* Capture and probe it */
                CapturedByteOffset = ProbeForReadLargeInteger(ByteOffset);
            }

            /* Capture and probe the key */
            if (Key) CapturedKey = ProbeForReadUlong(Key<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值