青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

關(guān)于 TrueCrypt

Posted on 2008-09-04 11:47 沒(méi)畫(huà)完的畫(huà) 閱讀(3602) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): Windows Driver
實(shí)現(xiàn)功能:
將用戶(hù)指定的某個(gè)文件A 虛擬成一個(gè)分區(qū)B, 用戶(hù)在分區(qū)上B操作的數(shù)據(jù)會(huì)保存到文件A上

需要解決的問(wèn)題:
1、如何虛擬出一個(gè)新的設(shè)備(分區(qū))?
2、如何將訪(fǎng)問(wèn)這個(gè)分區(qū)的操作轉(zhuǎn)化為讀取某個(gè)文件的操作?

2008.09.02
 大概看了 TrueCrypt 源代碼

1.
DriverEntry() 中
 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
 {
  DriverObject->MajorFunction[i] = TCDispatchQueueIRP;
 }

2、TCDispatchQueueIRP 處理 IRP 代碼
 case IRP_MJ_FLUSH_BUFFERS:
 case IRP_MJ_READ:
 case IRP_MJ_WRITE:
 case IRP_MJ_DEVICE_CONTROL:
  if (Extension->bRootDevice)
  {
   if (irpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
    return ProcessMainDeviceControlIrp (DeviceObject, Extension, Irp);
   break;
  }
在處理IRP時(shí),還需要注意區(qū)分是系統(tǒng)真實(shí)分區(qū)發(fā)出的IRP,還是由虛擬出來(lái)的分區(qū)發(fā)出的IRP

3、ProcessMainDeviceControlIrp() 中
 case TC_IOCTL_MOUNT_VOLUME:
   Irp->IoStatus.Information = sizeof (MOUNT_STRUCT);
   Irp->IoStatus.Status = MountDevice (DeviceObject, mount);
   DriverMutexRelease ();
判斷由應(yīng)用程序發(fā)出的 CTL_CODE

4、MountDevice() 中
 ntStatus = TCCreateDeviceObject (DeviceObject->DriverObject, &NewDeviceObject,
  mount);
 if (!NT_SUCCESS (ntStatus))
 {
  Dump ("Mount CREATE DEVICE ERROR, ntStatus = 0x%08x\n", ntStatus);
  return ntStatus;
 }

5、TCCreateDeviceObject() 中
NTSTATUS
TCCreateDeviceObject (PDRIVER_OBJECT DriverObject,
         PDEVICE_OBJECT * ppDeviceObject,
         MOUNT_STRUCT * mount)
{
 UNICODE_STRING Win32NameString, ntUnicodeString;
 WCHAR dosname[32], ntname[32];
 PEXTENSION Extension;
 NTSTATUS ntStatus;
 ULONG devChars = 0;
 Dump ("TCCreateDeviceObject BEGIN\n");
 ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
 TCGetDosNameFromNumber (dosname, mount->nDosDriveNo);
 TCGetNTNameFromNumber (ntname, mount->nDosDriveNo);
 RtlInitUnicodeString (&ntUnicodeString, ntname);
 RtlInitUnicodeString (&Win32NameString, dosname);
 devChars = FILE_DEVICE_SECURE_OPEN;
 devChars |= mount->bMountReadOnly ? FILE_READ_ONLY_DEVICE : 0;
 devChars |= mount->bMountRemovable ? FILE_REMOVABLE_MEDIA : 0;
 Dump ("Creating device nt=%ls dos=%ls\n", ntname, dosname);
 ntStatus = IoCreateDevice (
       DriverObject,   /* Our Driver Object */
       sizeof (EXTENSION), /* Size of state information */
       &ntUnicodeString,  /* Device name "\Device\Name" */
       FILE_DEVICE_DISK,  /* Device type */
       devChars,    /* Device characteristics */
       FALSE,    /* Exclusive device */
       ppDeviceObject);  /* Returned ptr to Device Object */
 if (!NT_SUCCESS (ntStatus))
 {
  Dump ("TCCreateDeviceObject NTSTATUS = 0x%08x END\n", ntStatus);
  return ntStatus;/* Failed to create DeviceObject */
 }
 /* Initialize device object and extension. */
 (*ppDeviceObject)->Flags |= DO_DIRECT_IO;
 (*ppDeviceObject)->StackSize += 2;  // Reduce occurrence of NO_MORE_IRP_STACK_LOCATIONS bug check caused by buggy drivers
 /* Setup the device extension */
 Extension = (PEXTENSION) (*ppDeviceObject)->DeviceExtension;
 memset (Extension, 0, sizeof (EXTENSION));
 Extension->IsVolumeDevice = TRUE;
 Extension->lMagicNumber = 0xabfeacde;
 Extension->nDosDriveNo = mount->nDosDriveNo;
 Extension->bRemovable = mount->bMountRemovable;
 KeInitializeEvent (&Extension->keCreateEvent, SynchronizationEvent, FALSE);
 KeInitializeSemaphore (&Extension->RequestSemaphore, 0L, MAXLONG);
 KeInitializeSpinLock (&Extension->ListSpinLock);
 InitializeListHead (&Extension->ListEntry);
 Dump ("TCCreateDeviceObject STATUS_SUCCESS END\n");
 return STATUS_SUCCESS;
}   

虛擬出一個(gè)分區(qū)的關(guān)鍵應(yīng)該在 (5) 中,等明天再試。

2008.09.03
在昨天的基礎(chǔ)上, 嘗試將創(chuàng)建虛擬設(shè)備的部份代碼抽出來(lái)
代碼如下:
  1#ifdef __cplusplus
  2extern "C"
  3{
  4#endif
  5#include <ntddk.h>
  6#ifdef __cplusplus
  7}
  8#endif
  9#ifdef NT4_DRIVER
 10#define DRIVER_STR WIDE
 11#else
 12#define DRIVER_STR
 13#endif
 14#define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
 15PDEVICE_OBJECT gSFilterDriverObject = NULL;
 16/**//* This structure is allocated for non-root devices! WARNING: bRootDevice
 17   must be the first member of the structure! */
 18typedef struct EXTENSION
 19{
 20} EXTENSION, *PEXTENSION;
 21typedef struct _DEVICE_EXTENSION
 22{
 23PDEVICE_OBJECT fdo;
 24PDEVICE_OBJECT NextStackDevice;
 25UNICODE_STRING ifSymLinkName;
 26}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 27extern "C" NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
 28IN PDEVICE_OBJECT PhysicalDeviceObject)
 29{
 30  
 31  NTSTATUS status;
 32  PDEVICE_OBJECT fdo;
 33  
 34  status = IoCreateDevice(
 35  DriverObject,
 36  sizeof(DEVICE_EXTENSION),
 37  NULL,
 38  FILE_DEVICE_DISK, 
 39  0, 
 40  FALSE, 
 41  &fdo); 
 42  
 43  if( !NT_SUCCESS(status))
 44     return status;
 45  
 46  PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
 47  dx->fdo = fdo;
 48  
 49  dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
 50  fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
 51  fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 52  
 53  return STATUS_SUCCESS;
 54}
 55extern "C" void
 56TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
 57{
 58 WCHAR tmp[3] =
 59 {0, ':', 0};
 60 int j = nDriveNo + (WCHAR) 'A';
 61 tmp[0] = (short) j;
 62 wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
 63 wcsncat (ntname, tmp, 1);
 64}
 65extern "C" NTSTATUS
 66DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
 67{
 68    NTSTATUS ntStatus;   
 69    WCHAR dosname[32], ntname[32]; 
 70    ULONG devChars = 0;
 71    // 定義一個(gè) Unicode 字符串
 72    UNICODE_STRING ntUnicodeString;
 73    //RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
 74    DriverObject->DriverExtension->AddDevice = AddDevice;
 75    KdPrint(("SFilter!DriverEntry\n"));
 76    
 77    TCGetNTNameFromNumber (ntname, 3);
 78    RtlInitUnicodeString (&ntUnicodeString, ntname);
 79    KdPrint(("SFilter!DriverEntry: Create Driver \"%wZ\"\n", &ntUnicodeString));
 80   devChars = FILE_DEVICE_SECURE_OPEN;
 81 
 82   PDEVICE_OBJECT pDeviceObject = NULL;
 83 
 84    // 創(chuàng)建虛擬設(shè)備
 85    ntStatus = IoCreateDevice (
 86       DriverObject,   /**//* Our Driver Object */
 87       sizeof (EXTENSION), /**//* Size of state information */
 88       &ntUnicodeString,  /**//* Device name "\Device\Name" */
 89       FILE_DEVICE_DISK,  /**//* Device type */
 90       devChars,    /**//* Device characteristics */
 91       FALSE,    /**//* Exclusive device */
 92       &pDeviceObject);  /**//* Returned ptr to Device Object */
 93                            
 94    if ( !NT_SUCCESS( ntStatus ) )
 95    {
 96        KdPrint(("SFilter!DriverEntry: Error Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
 97    }
 98    else
 99    {
100        KdPrint(("SFilter!DriverEntry: Success Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
101    }
102    
103    return ntStatus;
104}
105

使用 windgb 調(diào)試得到

SFilter!DriverEntry
SFilter!DriverEntry: Create Driver "?"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b
問(wèn)題:
設(shè)備創(chuàng)建失敗, 可能是由 ntUnicodeString 非法,
但為何 ntUnicodeString 會(huì)變成 ?
經(jīng)試驗(yàn), 將 KdPrint 的 \"%wZ\", 改為 %s

 KdPrint(("SFilter!DriverEntry\n"));
    TCGetNTNameFromNumber (ntname, 3);
   
    KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
   
    RtlInitUnicodeString (&ntUnicodeString, ntname);
KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
--------------------------------------------------
輸出結(jié)果
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "$"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b

經(jīng)過(guò) RtlInitUnicodeString (&ntUnicodeString, ntname); 后
ntUnicodeString 變成了 "?" ?
于是查 MSDN RtlInitUnicodeString 相關(guān)的信息, 用法似乎沒(méi)有錯(cuò)
修改了一下程序
extern "C" void
TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
{
 WCHAR tmp[3] = {0, ':', 0};
 int j = nDriveNo + (WCHAR) 'A';
 tmp[0] = (short) j;
 wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
 
 KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%d\"\n", nDriveNo)); 
 KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
     
 wcsncat (ntname, tmp, 1);
 
 KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
}

extern "C" NTSTATUS
DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
    NTSTATUS ntStatus;   
    WCHAR dosname[32], ntname[32]; 
    ULONG devChars = 0;

    // 定義一個(gè) Unicode 字符串
    UNICODE_STRING ntUnicodeString;
    //RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");

    DriverObject->DriverExtension->AddDevice = AddDevice;

    KdPrint(("SFilter!DriverEntry\n"));

    
    TCGetNTNameFromNumber (ntname, 3);
    
    KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
    
    RtlInitUnicodeString (&ntUnicodeString, ntname);

    KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));

 

輸出結(jié)果如下:
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b

接著,藍(lán)屏……

表示很懷疑,把  tmp 的值也打印出來(lái)

KdPrint(("TCGetNTNameFromNumber: Create Driver tmp = \"%s\"\n", tmp));   
wcsncat (ntname, tmp, 1);
----------------------------------------------------------------------------------------
結(jié)果顯示
SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver tmp = "D"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"
SFilter!DriverEntry: Error Creating Control Device Object "?", status=c000003b

---
根據(jù)代碼的執(zhí)行結(jié)果:
tmp 的值應(yīng)該是 D: 才對(duì)!!!!! 奇怪!!!

問(wèn)題,
1、KdPrint 在打印 WCHAR[] 與 UNICODE_STRING 時(shí)的處理
2、WCHAR[] 與 UNICODE_STRING 的連接又該如何?(如果沒(méi)有成功編譯 TrueCrypt,所以無(wú)法跟蹤到它里面的值的變化)
--------------------------------------------------------
于是先把創(chuàng)建設(shè)備的代碼去掉,先把 ntUnicodeString  正確顯示出來(lái)

#ifdef __cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif
#ifdef NT4_DRIVER
#define DRIVER_STR WIDE
#else
#define DRIVER_STR
#endif
#define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
PDEVICE_OBJECT gSFilterDriverObject = NULL;
/**//* This structure is allocated for non-root devices! WARNING: bRootDevice
   must be the first member of the structure! */
typedef struct EXTENSION
{
} EXTENSION, *PEXTENSION;
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;
PDEVICE_OBJECT NextStackDevice;
UNICODE_STRING ifSymLinkName;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
extern "C" NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
  
  NTSTATUS status;
  PDEVICE_OBJECT fdo;
  
  status = IoCreateDevice(
  DriverObject,
  sizeof(DEVICE_EXTENSION),
  NULL,
  FILE_DEVICE_DISK, 
  0, 
  FALSE, 
  &fdo); 
  
  if( !NT_SUCCESS(status))
     return status;
  
  PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
  dx->fdo = fdo;
  
  dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
  fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
  fdo->Flags &= ~DO_DEVICE_INITIALIZING;
  
  return STATUS_SUCCESS;
}
extern "C" void
TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo)
{
 WCHAR tmp[3] = {0, ':', 0};
 int j = nDriveNo + (WCHAR) 'A';
 tmp[0] = (short) j;
 wcscpy (ntname, (LPWSTR) NT_MOUNT_PREFIX);
 
 KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%d\"\n", nDriveNo)); 
 KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
 
  KdPrint(("TCGetNTNameFromNumber: Create Driver tmp = \"%s\"\n", tmp));    
  wcsncat (ntname, tmp, 1);
  
 KdPrint(("TCGetNTNameFromNumber: Create Driver ntname = \"%s\"\n", ntname));
}
extern "C" NTSTATUS
DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
    NTSTATUS ntStatus = STATUS_SUCCESS;   
    WCHAR dosname[32], ntname[32]; 
    ULONG devChars = 0;
    // 定義一個(gè) Unicode 字符串
    UNICODE_STRING ntUnicodeString;
    //RtlInitUnicodeString(&nameString, L"\\FileSystem\\Filters\\SFilter");
    DriverObject->DriverExtension->AddDevice = AddDevice;
    KdPrint(("SFilter!DriverEntry\n"));
    
    TCGetNTNameFromNumber (ntname, 3);
    
    KdPrint(("SFilter!DriverEntry: Create Driver ntname = \"%s\"\n", &ntname));
    
    RtlInitUnicodeString (&ntUnicodeString, ntname);
    KdPrint(("SFilter!DriverEntry: Create Driver ntUnicodeString = \"%s\"\n", &ntUnicodeString));
/**//*
   devChars = FILE_DEVICE_SECURE_OPEN;
 
   PDEVICE_OBJECT pDeviceObject = NULL;
 
    // 創(chuàng)建虛擬設(shè)備
    ntStatus = IoCreateDevice (
       DriverObject,   /* Our Driver Object * /
       sizeof (EXTENSION), /* Size of state information * /
       &ntUnicodeString,  /* Device name "\Device\Name" * /
       FILE_DEVICE_DISK,  /* Device type * /
       devChars,    /* Device characteristics * /
       FALSE,    /* Exclusive device * /
       &pDeviceObject);  /* Returned ptr to Device Object * /
                            
    if ( !NT_SUCCESS( ntStatus ) )
    {
        KdPrint(("SFilter!DriverEntry: Error Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
    }
    else
    {
        KdPrint(("SFilter!DriverEntry: Success Creating Control Device Object \"%wZ\", status=%08x\n", &ntUnicodeString, ntStatus));
    }*/
    
    return ntStatus;
}

---
代碼改成了這樣后, 調(diào)試依然會(huì)藍(lán)屏。
 

SFilter!DriverEntry
TCGetNTNameFromNumber: Create Driver ntname = "3"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
TCGetNTNameFromNumber: Create Driver tmp = "D"
TCGetNTNameFromNumber: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntname = "\Device\TrueCryptVolume"
SFilter!DriverEntry: Create Driver ntUnicodeString = "H"

*** Fatal System Error: 0x0000007e
                       (0xC0000005,0x46656D61,0xF9EA2770,0xF9EA246C)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.



需要回滾代碼。明天再繼續(xù)。



2008.09.04
今天打算先看下應(yīng)用層與驅(qū)動(dòng)通信的方法
然后再看下由 Bill Gates 說(shuō)的(做file disk建議看filedisk的源代碼,在http://www.acc.umu.se/~bosse。)
在開(kāi)始工作之前,先感謝一下 BillGates ,雖然他已經(jīng)退休了,但居然光臨我的BLOG,
讀 filedisk 的代碼前,想先使用一下它
看了 Readme,安裝 filedisk 的步驟(它居然連 .inf 都省了,直接用.reg 暈!!!! )
1、把 filedisk.sys 拷貝到 %systemroot%\system32\drivers\
2、filedisk.reg 里面設(shè)置的驅(qū)動(dòng)加載方面默認(rèn)是{自動(dòng)}的,所以不用改了
    產(chǎn)生問(wèn)題1:
    有了這個(gè)  .reg 就相當(dāng)于 .inf?  .reg 安裝驅(qū)動(dòng)跟 .inf 安裝驅(qū)動(dòng)方法的區(qū)別?
    -- 未解決
3、運(yùn)行 filedisk.reg 然后重啟
4、重啟后, 在cmd 窗體執(zhí)行命令 
    filedisk /mount 0 c:\test.img 8M e:
5、此時(shí),系統(tǒng)多出一個(gè) e 盤(pán),雙擊提示未格式化,格式化完 E 盤(pán)后,就可以像普通磁盤(pán)一樣操作了
 
產(chǎn)生問(wèn)題1: 看了下設(shè)備管理器并沒(méi)有多出一個(gè)設(shè)備,那么E盤(pán)怎么出來(lái)的?
              用 WinObj.exe 也無(wú)所發(fā)現(xiàn)  (先迷茫一下先!!!)
 
接下來(lái),試下編譯 filedisk sys 的源程序
build filedisk 沒(méi)出現(xiàn)問(wèn)題,生成了 check 的 filedisk.sys
 
然后,試下編譯 filedisk exe 的程序
在 exe 目錄下 nmake /f makefile ,卻出現(xiàn)錯(cuò)誤提示
Microsoft (R) Program Maintenance Utility   Version 6.00.9782.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

makefile(7) : fatal error U1052: file '\makefile.def' not found
Stop.
 
google了一下,找到方法
據(jù)說(shuō) exe 同樣用DDK的環(huán)境來(lái)編譯
在 filedisk 的 exe 目錄  build -cz
 
果然,編譯通過(guò)了生成了 filedisk.exe
 
產(chǎn)生問(wèn)題1:
filedisk 的 exe 為何不能用 nmake 來(lái)編譯?
產(chǎn)生問(wèn)題2:
ddk 也可以用來(lái)編譯 exe 程序?
產(chǎn)生問(wèn)題3:
如果用 vc 建一個(gè) Win32 Console Application 工程又能否編譯?
-- 試了一下,果然是可以滴!!
 
把自己編譯的 filedisk.sys 和 filedisk.exe 放到虛擬機(jī)試下是否正常先.
因?yàn)閯倓傇谇懊嬉呀?jīng)設(shè)置了驅(qū)動(dòng)是自動(dòng)加載的,怕覆蓋 filedisk.sys 后,系統(tǒng)還是會(huì)用回原來(lái)的 filedisk.sys
于是重啟一下系統(tǒng)先~!
 
產(chǎn)生很奇怪的問(wèn)題1:
用自己編譯的 exe && sys 運(yùn)后,可以正常虛擬一個(gè)分區(qū)出來(lái),但 win 提示不能格式化分區(qū)
-- 用原先的 exe 再試一下, 試過(guò)后, win 仍然提示不能格式化分區(qū)
    于是用回 原先的 sys 再試一下,
    突然間懷疑,是不是 映象文件的問(wèn)題,因?yàn)槲矣玫氖?br>    filedisk /mount 0 c:\test.txt 8M e:
    后綴名是 .txt 
    改成 filedisk /mount 0 c:\test.img 8M e: 后 win 提示格式化分區(qū)成功,于是
 
產(chǎn)生很奇怪的問(wèn)題2:
   filedisk 的映象文件的后綴名如果為 .txt ,會(huì)導(dǎo)致 win 不能格式化虛擬出來(lái)的分區(qū)?
   按道理應(yīng)該跟映象文件的后綴名無(wú)關(guān)才是,估計(jì)要研究下里面的代碼才清楚了!!!
-- 未解決
 
另外還產(chǎn)生很奇怪的問(wèn)題3:
   我把映象文件的大小設(shè)置 1K, win會(huì)提示“無(wú)法完成格式化”,難道 win 需要空間存放文件分配表?
   試了一下,映象文件的大小在 3M 左右,win才可以格式化成功,具體值無(wú)嘗試
   另一方面,如果 windows 的分區(qū)在格式化時(shí),它應(yīng)該會(huì)建一個(gè){文件分配表}之類(lèi)的東西,
   而這個(gè){文件分配表}的大小應(yīng)該跟分區(qū)的大小有關(guān) (暫無(wú)找到相關(guān)的資料,未解決)
-- 未解決
 
大概看了下 filedisk.c 的代碼, 里面用的是 
CreateFile + DeviceIoControl 的方法 跟 驅(qū)動(dòng)通信
里面并沒(méi)有采用動(dòng)態(tài)加載驅(qū)動(dòng)
問(wèn)題1:
如何動(dòng)態(tài)加載驅(qū)動(dòng)?
之前在網(wǎng)上看到的資料應(yīng)該有“SM”之類(lèi)的API可以動(dòng)態(tài)加載驅(qū)動(dòng),
這個(gè)有時(shí)間再研究.

一個(gè)上午的時(shí)間就這樣被花光了!!!!!



問(wèn)題1:
運(yùn)行 TrueCrypt\Driver\BuildDriver.cmd ,不能編譯驅(qū)動(dòng),提示 "BuildDriver.cmd: error: Cannot copy target."
沒(méi)有時(shí)間看 ReadMe. 未解決

問(wèn)題2:
將 TrueCrypt.sln 用工具轉(zhuǎn)換為 TrueCrypt.dsw ,打開(kāi)后無(wú)論編譯哪一個(gè)工程,都會(huì)提示很多錯(cuò)誤信息
未解決

問(wèn)題3:
IoCreateDevice 最后一個(gè)參數(shù) Returned ptr to Device Object, 是否需要為其分配空間
-- Answered by bill Bill Gates : Device Object對(duì)象由系統(tǒng)分配,系統(tǒng)會(huì)在這個(gè)對(duì)象reference count為0的時(shí)候自動(dòng)銷(xiāo)毀。

安裝 filedisk 后
產(chǎn)生問(wèn)題1: 看了下設(shè)備管理器并沒(méi)有多出一個(gè)設(shè)備,那么E盤(pán)怎么出來(lái)的?
              用 WinObj.exe 也無(wú)所發(fā)現(xiàn)  (先迷茫一下先!!!)

產(chǎn)生問(wèn)題1:
filedisk 的 exe 為何不能用 nmake 來(lái)編譯?
產(chǎn)生問(wèn)題2:
ddk 也可以用來(lái)編譯 exe 程序?
產(chǎn)生問(wèn)題3:
如果用 vc 建一個(gè) Win32 Console Application 工程又能否編譯?
-- 試了一下,果然是可以滴!!

產(chǎn)生很奇怪的問(wèn)題1:
用自己編譯的 exe && sys 運(yùn)后,可以正常虛擬一個(gè)分區(qū)出來(lái),但 win 提示不能格式化分區(qū)
-- 用原先的 exe 再試一下, 試過(guò)后, win 仍然提示不能格式化分區(qū)
    于是用回 原先的 sys 再試一下,
    突然間懷疑,是不是 映象文件的問(wèn)題,因?yàn)槲矣玫氖?br>    filedisk /mount 0 c:\test.txt 8M e:
    后綴名是 .txt 
    改成 filedisk /mount 0 c:\test.img 8M e: 后 win 提示格式化分區(qū)成功,于是
 
產(chǎn)生很奇怪的問(wèn)題2:
   filedisk 的映象文件的后綴名如果為 .txt ,會(huì)導(dǎo)致 win 不能格式化虛擬出來(lái)的分區(qū)?
   按道理應(yīng)該跟映象文件的后綴名無(wú)關(guān)才是,估計(jì)要研究下里面的代碼才清楚了!!!
-- 未解決
 
另外還產(chǎn)生很奇怪的問(wèn)題3:
   我把映象文件的大小設(shè)置 1K, win會(huì)提示“無(wú)法完成格式化”,難道 win 需要空間存放文件分配表?
   試了一下,映象文件的大小在 3M 左右,win才可以格式化成功,具體值無(wú)嘗試
   另一方面,如果 windows 的分區(qū)在格式化時(shí),它應(yīng)該會(huì)建一個(gè){文件分配表}之類(lèi)的東西,
   而這個(gè){文件分配表}的大小應(yīng)該跟分區(qū)的大小有關(guān) (暫無(wú)找到相關(guān)的資料,未解決)
-- 未解決

Feedback

# re: 關(guān)于 TrueCrypt  回復(fù)  更多評(píng)論   

2008-09-03 22:18 by Bill Gates
3. Device Object對(duì)象由系統(tǒng)分配,系統(tǒng)會(huì)在這個(gè)對(duì)象reference count為0的時(shí)候自動(dòng)銷(xiāo)毀。

做file disk建議看filedisk的源代碼,在http://www.acc.umu.se/~bosse。TrueCrypt有很多加密解密部分,跟file disk無(wú)關(guān)。

# re: 關(guān)于 TrueCrypt  回復(fù)  更多評(píng)論   

2008-09-04 08:45 by 沒(méi)畫(huà)完的畫(huà)
Thx Bill

# re: 關(guān)于 TrueCrypt  回復(fù)  更多評(píng)論   

2008-09-04 16:13 by 沒(méi)畫(huà)完的畫(huà)
發(fā)現(xiàn) Bill Gates 說(shuō)錯(cuò)了

MSDN 中說(shuō)

IoCreateDevice creates a device object and returns a pointer to the object. The caller is responsible for deleting the object when it is no longer needed by calling IoDeleteDevice.

所以并不是系統(tǒng)自動(dòng)銷(xiāo)毀的

# re: 關(guān)于 TrueCrypt  回復(fù)  更多評(píng)論   

2008-09-08 16:26 by Bill Gates
IoDeleteDevice 只是把reference count - 1,到0的時(shí)候才刪除
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            尤物九九久久国产精品的特点| 免费亚洲电影在线观看| 国产精品乱码一区二区三区| 欧美精品1区2区| 欧美精品在线观看播放| 欧美成人r级一区二区三区| 蜜臀av在线播放一区二区三区| 国产精品色一区二区三区| 一区二区三区欧美视频| 国产女人aaa级久久久级| 国产精品亚洲成人| 国产亚洲永久域名| 亚洲成人原创| 一区二区高清| 久久久精品国产一区二区三区| 麻豆精品传媒视频| 亚洲国产一区二区三区高清| 麻豆国产精品va在线观看不卡| 欧美激情国产精品| 夜夜爽av福利精品导航| 亚洲一区www| 理论片一区二区在线| 欧美日韩一级大片网址| 国产欧美一区视频| 亚洲日本中文字幕区| 亚洲一区二区三区在线观看视频| 久久精品日产第一区二区| 亚洲电影欧美电影有声小说| 99re热这里只有精品视频 | 久久亚洲欧洲| 欧美午夜片在线免费观看| 亚洲第一网站免费视频| 亚洲影院色无极综合| 欧美成人午夜视频| 国产最新精品精品你懂的| 99re这里只有精品6| 久久久久九九九| 99re8这里有精品热视频免费| 久久久久国产精品麻豆ai换脸| 欧美精品七区| 亚洲第一精品久久忘忧草社区| 亚洲视频欧美视频| 久久琪琪电影院| 亚洲欧美日韩精品一区二区| 欧美11—12娇小xxxx| 国语自产精品视频在线看一大j8 | 亚洲综合色激情五月| 欧美成人免费观看| 亚洲成人在线免费| 久久亚洲一区二区| 亚洲一区日韩在线| 国产精品久久久久av免费| 亚洲韩国日本中文字幕| 久久久久久一区| 亚洲国产视频a| 久久精品中文| 性一交一乱一区二区洋洋av| 国产精品盗摄久久久| 一本色道久久综合狠狠躁篇的优点 | 欧美在线视频免费播放| 日韩午夜免费| 欧美日韩国产三区| 日韩午夜在线| 日韩视频一区二区| 欧美日韩人人澡狠狠躁视频| 亚洲精品欧美在线| 91久久在线播放| 久久夜色精品国产亚洲aⅴ| 国内外成人在线| 久久久成人精品| 久久久久久久久久久久久9999| 狠狠爱综合网| 欧美国产极速在线| 欧美高清在线一区二区| 亚洲免费大片| 亚洲一区999| 韩国久久久久| 亚洲国产美女| 国产精品久久久久9999高清| 久久精品伊人| 欧美成ee人免费视频| 一区二区激情视频| 亚洲欧美99| 1769国产精品| 一区二区电影免费观看| 国产伦一区二区三区色一情| 久久这里有精品视频| 欧美国产91| 亚洲欧美日韩另类精品一区二区三区| 亚洲少妇诱惑| 亚洲国产一成人久久精品| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲一区二区视频在线| 国产精品一区二区视频| 狼狼综合久久久久综合网| 欧美激情一区二区三区成人| 亚洲免费人成在线视频观看| 久久av一区二区| 日韩一级精品| 欧美一区二区精美| 日韩一级成人av| 久久精品视频亚洲| 亚洲欧美在线观看| 开心色5月久久精品| 亚洲一区二区三区色| 久久久91精品国产一区二区精品| 日韩视频一区二区三区在线播放| 亚洲视频一区二区| 亚洲精品久久久一区二区三区| 亚洲视屏在线播放| 欧美国产精品v| 亚洲免费小视频| 麻豆久久精品| 久久久久www| 欧美日韩国产色站一区二区三区| 久久精品一区二区三区四区 | 亚洲国产精品第一区二区三区 | 亚洲欧美国产77777| 亚洲国产精品小视频| 亚洲综合日韩中文字幕v在线| 亚洲电影欧美电影有声小说| 亚洲一区二区精品在线| 一区二区三区欧美亚洲| 久久久蜜桃一区二区人| 久久九九免费视频| 国产精品人成在线观看免费| 亚洲理论电影网| 亚洲激情电影中文字幕| 久久久久久久久久久久久女国产乱 | 国产精品美女诱惑| 亚洲三级视频在线观看| 伊人精品成人久久综合软件| 欧美亚洲免费在线| 性色av一区二区三区在线观看 | 亚洲男女自偷自拍| 亚洲欧美综合另类中字| 国产精品超碰97尤物18| 亚洲精品久久久久久下一站| 亚洲精品美女在线观看| 美女日韩在线中文字幕| 欧美暴力喷水在线| 1000部精品久久久久久久久| 久久精品99无色码中文字幕| 欧美在线日韩精品| 国产日韩在线一区二区三区| 亚洲欧美激情四射在线日 | 久久久一二三| 鲁大师成人一区二区三区| 狠狠色狠狠色综合人人| 欧美一区二粉嫩精品国产一线天| 亚洲欧美一区二区三区久久| 国产精品毛片| 午夜精品美女自拍福到在线| 性做久久久久久| 国产亚洲精品自拍| 久久福利资源站| 免费观看不卡av| 亚洲国产精品成人综合| 欧美经典一区二区| 一本久道久久综合狠狠爱| 亚洲一区二区三区在线看 | 亚洲免费在线| 开元免费观看欧美电视剧网站| 亚洲国产精品热久久| 欧美日韩一区综合| 性刺激综合网| 牛牛精品成人免费视频| aa成人免费视频| 国产日韩精品久久| 蜜臀av性久久久久蜜臀aⅴ| 一区二区三区蜜桃网| 久久久久高清| 一本久久综合| 激情校园亚洲| 欧美性大战久久久久久久蜜臀| 欧美一级二级三级蜜桃| 亚洲高清不卡在线观看| 午夜日韩在线观看| 最新亚洲一区| 国产女人18毛片水18精品| 免费观看日韩av| 先锋资源久久| 99国产精品久久久久久久| 久久av一区| 99re这里只有精品6| 国产一区在线播放| 欧美精品一区二区三区视频| 久久av一区二区三区亚洲| 99视频+国产日韩欧美| 久久美女性网| 亚洲欧美久久| 最新高清无码专区| 国产一区二区三区无遮挡| 欧美午夜在线视频| 巨乳诱惑日韩免费av| 欧美亚洲一区在线| 在线亚洲+欧美+日本专区| 亚洲电影免费观看高清完整版在线| 久久精品国产免费观看| 亚洲视频在线二区|