Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当我们强制转换描述符+;描述符->;serialnumberofset_C_Filesystems_Kernel_Driver_Wdk - Fatal编程技术网

C 当我们强制转换描述符+;描述符->;serialnumberofset

C 当我们强制转换描述符+;描述符->;serialnumberofset,c,filesystems,kernel,driver,wdk,C,Filesystems,Kernel,Driver,Wdk,我有一个内核驱动程序,用于查找存储设备的序列号,但驱动程序有一个问题。 描述符->serialnumberofset是103 但是(LPCSTR)(UINT_PTR)描述符+(DWORD32)描述符->serialnumberofset为空 这是我的代码 请分享如何解决这个问题您在OutputBufferLength中犯了错误-为什么您认为sizeof(存储设备描述符)*4就足够了?例如,为什么不5*sizeof(存储设备描述符)?实际上,OutputBufferLength必须是什么是未知的-

我有一个内核驱动程序,用于查找存储设备的序列号,但驱动程序有一个问题。
描述符->serialnumberofset
103 但是
(LPCSTR)(UINT_PTR)描述符+(DWORD32)描述符->serialnumberofset
为空

这是我的代码


请分享如何解决这个问题

您在
OutputBufferLength
中犯了错误-为什么您认为
sizeof(存储设备描述符)*4就足够了?例如,为什么不
5*sizeof(存储设备描述符)
?实际上,
OutputBufferLength
必须是什么是未知的-您需要在循环中调用此查询,并将当前的
OutputBufferLength
STORAGE\u DEVICE\u DESCRIPTOR.Size
-如果
OutputBufferLength
,则必须再次发送
IOCTL\u STORAGE\u query\u属性
OutputBufferLength=STORAGE\u DEVICE\u DESCRIPTOR.Size
。代码可以是这样的

        STORAGE_PROPERTY_QUERY spq = { StorageDeviceProperty, PropertyStandardQuery }; 

        union {
            PVOID buf;
            PSTR psz;
            PSTORAGE_DEVICE_DESCRIPTOR psdd;
        };

        ULONG size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 0x100;

        NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

        do 
        {
            status = STATUS_INSUFFICIENT_RESOURCES;

            if (buf = ExAllocatePool(PagedPool, size))
            {
                switch (status = (NtDeviceIoControlFile(hFile, 0, 0, 0, &iosb, 
                    IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), buf, size)))
                {
                case STATUS_SUCCESS:
                case STATUS_BUFFER_OVERFLOW:
                    if (psdd->Version == sizeof(STORAGE_DEVICE_DESCRIPTOR))
                    {
                        if (psdd->Size > size)
                        {
                            size = psdd->Size;
                            status = STATUS_BUFFER_OVERFLOW;
                        }
                        else
                        {
                            if (psdd->SerialNumberOffset)
                            {
                                DbgPrint("SerialNumber = %s\n", psz + psdd->SerialNumberOffset);
                            }
                        }
                    }
                    else
                    {
                        status = STATUS_INVALID_PARAMETER;
                    }
                    break;
                }

                ExFreePool(buf);
            }
        } while (status == STATUS_BUFFER_OVERFLOW);
我们当然可以使用
IoBuildDeviceIoControlRequest
+
IoCallDriver
-这没有任何变化,与问题无关

        STORAGE_PROPERTY_QUERY spq = { StorageDeviceProperty, PropertyStandardQuery }; 

        union {
            PVOID buf;
            PSTR psz;
            PSTORAGE_DEVICE_DESCRIPTOR psdd;
        };

        ULONG size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 0x100;

        NTSTATUS status = STATUS_INSUFFICIENT_RESOURCES;

        do 
        {
            status = STATUS_INSUFFICIENT_RESOURCES;

            if (buf = ExAllocatePool(PagedPool, size))
            {
                switch (status = (NtDeviceIoControlFile(hFile, 0, 0, 0, &iosb, 
                    IOCTL_STORAGE_QUERY_PROPERTY, &spq, sizeof(spq), buf, size)))
                {
                case STATUS_SUCCESS:
                case STATUS_BUFFER_OVERFLOW:
                    if (psdd->Version == sizeof(STORAGE_DEVICE_DESCRIPTOR))
                    {
                        if (psdd->Size > size)
                        {
                            size = psdd->Size;
                            status = STATUS_BUFFER_OVERFLOW;
                        }
                        else
                        {
                            if (psdd->SerialNumberOffset)
                            {
                                DbgPrint("SerialNumber = %s\n", psz + psdd->SerialNumberOffset);
                            }
                        }
                    }
                    else
                    {
                        status = STATUS_INVALID_PARAMETER;
                    }
                    break;
                }

                ExFreePool(buf);
            }
        } while (status == STATUS_BUFFER_OVERFLOW);