• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            沒(méi)畫完的畫

            喂馬 劈柴 BBQ~
            posts - 37, comments - 55, trackbacks - 0, articles - 0
              C++博客 ::  :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            2008.09.04

            此篇是(關(guān)于 TrueCrypt)的續(xù)集, 在看此篇前先看上篇,不然會(huì)很危險(xiǎn)

            從 DriverEntry 看起

            NTSTATUS
            DriverEntry (
            IN PDRIVER_OBJECT DriverObject,
            IN PUNICODE_STRING RegistryPath
            )
            {
            // 讀取注冊(cè)時(shí)使用的變量
            UNICODE_STRING parameter_path;
            RTL_QUERY_REGISTRY_TABLE query_table[2];
            ULONG n_devices;

            NTSTATUS status;
            UNICODE_STRING device_dir_name;
            OBJECT_ATTRIBUTES object_attributes;
            ULONG n;
            USHORT n_created_devices;
            // #define PARAMETER_KEY L"\\Parameters"
            parameter_path.Length = 0;
            parameter_path.MaximumLength = RegistryPath->Length + sizeof(PARAMETER_KEY);
            parameter_path.Buffer = (PWSTR) ExAllocatePool(PagedPool, parameter_path.MaximumLength);
            if (parameter_path.Buffer == NULL)
            return STATUS_INSUFFICIENT_RESOURCES;
            RtlCopyUnicodeString(&parameter_path, RegistryPath);
            RtlAppendUnicodeToString(&parameter_path, PARAMETER_KEY);
            RtlZeroMemory(&query_table[0], sizeof(query_table));
            query_table[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED;
            query_table[0].Name = NUMBEROFDEVICES_VALUE; // #define NUMBEROFDEVICES_VALUE L"NumberOfDevices"
            query_table[0].EntryContext = &n_devices;
            status = RtlQueryRegistryValues(
            RTL_REGISTRY_ABSOLUTE,
            parameter_path.Buffer,
            &query_table[0],
            NULL,
            NULL
            );
            ExFreePool(parameter_path.Buffer);
            if (!NT_SUCCESS(status))
            {
            // 如果讀取注冊(cè)表失敗, 則默認(rèn)為 4個(gè)
            // #define DEFAULT_NUMBEROFDEVICES 4
            KdPrint(("FileDisk: Query registry failed, using default values.\n"));
            n_devices = DEFAULT_NUMBEROFDEVICES;
            }
            // 下面的代碼完成在設(shè)備目錄中創(chuàng)建對(duì)應(yīng)的目錄
            /*
            * #define DEVICE_BASE_NAME _T("\\FileDisk")
            * #define DEVICE_DIR_NAME _T("\\Device") DEVICE_BASE_NAME
            * #define DEVICE_NAME_PREFIX DEVICE_DIR_NAME DEVICE_BASE_NAME
            */
            RtlInitUnicodeString(&device_dir_name, DEVICE_DIR_NAME);
            InitializeObjectAttributes(
            &object_attributes,
            &device_dir_name,
            OBJ_PERMANENT,
            NULL,
            NULL
            );
            status = ZwCreateDirectoryObject(
            &dir_handle,
            DIRECTORY_ALL_ACCESS,
            &object_attributes
            );
            if (!NT_SUCCESS(status))
            {
            return status;
            }
            // 將上面創(chuàng)建的設(shè)備目錄屬性設(shè)置為 臨時(shí)
            ZwMakeTemporaryObject(dir_handle);
            for (n = 0, n_created_devices = 0; n < n_devices; n++)
            {
            status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_DISK);
            if (NT_SUCCESS(status))
            {
            n_created_devices++;
            }
            }
            for (n = 0; n < n_devices; n++)
            {
            status = FileDiskCreateDevice(DriverObject, n, FILE_DEVICE_CD_ROM);
            if (NT_SUCCESS(status))
            {
            n_created_devices++;
            }
            }
            if (n_created_devices == 0)
            {
            ZwClose(dir_handle);
            return status;
            }
            DriverObject->MajorFunction[IRP_MJ_CREATE] = FileDiskCreateClose;
            DriverObject->MajorFunction[IRP_MJ_CLOSE] = FileDiskCreateClose;
            DriverObject->MajorFunction[IRP_MJ_READ] = FileDiskReadWrite;
            DriverObject->MajorFunction[IRP_MJ_WRITE] = FileDiskReadWrite;
            DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FileDiskDeviceControl;
            DriverObject->DriverUnload = FileDiskUnload;
            return STATUS_SUCCESS;
            }


            DriverEntry() 做的大概東西就是:
            1、讀取注冊(cè)表的
            HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FileDisk\Parameters\
            下面的 NumberOfDevices 這個(gè)值
            2、如果指定的設(shè)備目錄(\\FileDisk\\Device)不存在, 創(chuàng)建對(duì)應(yīng)的設(shè)備目錄
            3、然后調(diào)用 IoCreateDevice() 在創(chuàng)建的設(shè)備目錄下創(chuàng)建設(shè)備
            4、每創(chuàng)建一個(gè)設(shè)備都同時(shí)創(chuàng)建一個(gè)線程,具體用來(lái)做什么,正在摸索中.........

            問(wèn)題1: RTL_QUERY_REGISTRY_TABLE query_table[2]; // 這里為何要定義為 2?
            -- 未解決,先看下在應(yīng)用層讀取注冊(cè)表是如何做的先!

            問(wèn)題2: 將上面創(chuàng)建的設(shè)備目錄屬性設(shè)置為 臨時(shí) ZwMakeTemporaryObject(dir_handle);
            -- 未解決,設(shè)置屬性為臨時(shí)的作用是? 重啟系統(tǒng)時(shí)這個(gè)設(shè)備目錄會(huì)不存在? 如果不設(shè)置這個(gè)屬性,重啟系統(tǒng)后還存在?

            問(wèn)題3: 為何在 DriverEntry() 里就用 IoCreateDevice() 創(chuàng)建設(shè)備?不是等應(yīng)用層運(yùn)行用 mount 后才創(chuàng)建設(shè)備的嗎?
            -- 未解決,先郁悶一下!!!!

            問(wèn)題4: 關(guān)于[設(shè)備目錄](méi)的疑問(wèn),[設(shè)備目錄](méi)是個(gè)什么東東?……
            -- 未解決,在N久前,好像看過(guò)這樣一篇文章,講的是 Windows 下面所有內(nèi)核對(duì)象都是采用對(duì)象管理 之類的
            有空再找下這方面的詳細(xì)資料!!! 再郁悶一下!!!

            問(wèn)題5、FileDiskCreateDevice() 函數(shù)中在調(diào)用了 IoCreateDevice() 創(chuàng)建設(shè)備后
            設(shè)置了 device_object 的屬性, 這些語(yǔ)句的作用是什么?
            device_object->Flags |= DO_DIRECT_IO;

            device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension;

            device_extension->media_in_device = FALSE;

            if (DeviceType == FILE_DEVICE_CD_ROM)
            {
            device_object->Characteristics |= FILE_READ_ONLY_DEVICE;
            device_extension->read_only = TRUE;
            }


            另外奇怪的是, 為何設(shè)置 device_object 的屬性后,不需要調(diào) update() 之類的函數(shù),
            重新設(shè)置的屬性在設(shè)置完后就生效????

            問(wèn)題6、FileDisk.sys 在 DriverEntry() 就創(chuàng)建了四個(gè)設(shè)備,四條內(nèi)核線程,導(dǎo)致 mount 最多就 4 個(gè)設(shè)備,
            為何不做成可以動(dòng)態(tài)加載N個(gè)設(shè)備?(因?yàn)槲乙?jiàn)過(guò)其它類似于 TrueCrypt 的工具,是可以動(dòng)態(tài)Mount N個(gè)分區(qū)的)

            接下來(lái),應(yīng)該先了解下 驅(qū)動(dòng)與應(yīng)用層的通信方式是怎樣的先!Google 一下

            99久久精品国产麻豆| 亚洲欧洲久久av| 精品久久久久久无码免费| 久久人人爽人人澡人人高潮AV| 色综合久久中文字幕综合网| 久久中文字幕人妻熟av女| 久久天天躁狠狠躁夜夜网站| 国产成人无码精品久久久久免费| 久久久无码精品午夜| 久久男人Av资源网站无码软件| 国产女人aaa级久久久级| 超级97碰碰碰碰久久久久最新| 国产精品一区二区久久不卡 | 国产精品亚洲综合久久| 国产三级久久久精品麻豆三级 | 亚洲国产精品一区二区三区久久 | 99久久伊人精品综合观看| 亚洲国产精品无码久久一区二区| 国产精品一区二区久久精品无码| 人妻无码久久一区二区三区免费| 久久久久亚洲AV综合波多野结衣| 国产情侣久久久久aⅴ免费| 热久久视久久精品18| 久久精品国产亚洲av瑜伽| 色综合久久综合中文综合网| 中文成人无码精品久久久不卡| 国产精品99久久精品| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国产成人久久精品二区三区| av午夜福利一片免费看久久| 久久夜色精品国产噜噜麻豆| 尹人香蕉久久99天天拍| 伊人久久大香线蕉AV一区二区 | 99久久国产亚洲综合精品| 久久久久亚洲精品天堂| 久久久久高潮毛片免费全部播放| 久久久无码精品午夜| 一级女性全黄久久生活片免费| 久久婷婷五月综合色奶水99啪| 久久精品18| 久久综合亚洲鲁鲁五月天|