ltrdata / imdisk Goto Github PK
View Code? Open in Web Editor NEWImDisk Virtual Disk Driver
License: GNU General Public License v2.0
ImDisk Virtual Disk Driver
License: GNU General Public License v2.0
I have decided to create RAM disk to relieve some pressure from SDD drive when compiling software to prevent wear out, but still something is writing a lot to the SSD during the compilation process with MSVC, despite the whole project being put in a RAM drive and compiled from there. The fact that it is done inside virtual machine is irrelevant, right?
I would like to make sure that I have correctly set up imDisk for this task. Could you take a look at the following screenshot and commands and tell that it indeed creates a partition in RAM and not anywhere else (like in the virtual memory of pagefile)?
Manually starting these drivers due to #8:
sc create imdisk type= kernel binpath= "C:\imdisk_test\imdisk.sys"
sc start imdisk
sc create awealloc type= kernel binpath= "C:\imdisk_test\awealloc.sys"
sc start awealloc
Then executing the cpl file:
This is odd, but I triple-checked what I experienced, and here is the STR.
imdisk.exe -a -m G: -s 1g -p "/fs:exFAT /v:ImDisk /q /y"
IO error: Incorrect function. (os error 1) ExtensionStorageSync.jsm:66
). This only happens on an ImDisk volume.I also ran the same tests with the ImDisk volume formatted as NTFS. The same errors occurred.
In Windows 10, when setting virtual memory on the disk created by LmDisk, there will be an error during startup.
How do you do.
Gratefully for your software and work.
Need to create a RamDisk from image and place a PageFile on it.
But the RamDisk is being created after the Page File is requested.
This causes creation of temporary pagefile.sys
Windows 7
Task Scheduler running as SYSTEM on STARTUP:
start.cmd [imdisk -a -t vm -f "C:\ImD\X.img" -m X:]
Used tutorial from guru3D Forums of 2011, which worked for me under same conditions in the past.
with version ImDisk 2.0.6.
Tried also adding shortcut to folder "Startup" with the same parameters.
New versions seem to have "Run on system startup" - included in ImDisk Toolkit.
But this does not seem to work for me.
With respect.
Would adding CSO support from maxcso be possible?
ITEM | VALUE |
---|---|
OS Name | Microsoft Windows 11 Pro for Workstations |
Version | 10.0.26100 Build 26100.994 |
System Type | x64-based PC |
Installed Physical Memory (RAM) | 64.0 GB |
Total Physical Memory | 63.2 GB |
Available Physical Memory | 46.7 GB |
Total Virtual Memory | 76.2 GB |
Available Virtual Memory | 56.5 GB |
Page File Space | 13.0 GB |
Many installer exe file like 7-zip installer cannot be executed within the ramdisk. This happens on a newly installed system since 24H2 update. However, most of executables will not complain, such as 7zr.exe and a simple c++-written hello world.
Got the stack trace from the Process Hacker one of threads has having the cycles. It does change over the time, but the WriteFile been blocked on something. The whole system suffers from WriteFile blocking and none of application can be closed or terminated which had call to WriteFile recently. Even can not be terminated through the Process Hacker itself. The Process Hacker somehow survived that and I could take a single stack dump. Only the hard reset can reset the system, which means it is a critical bug.
Can't say how the notepad could save the stack trace into a file, may be the blocking is not stable.
0, ntoskrnl.exe!KeInsertQueueApc+0x5cb
1, ntoskrnl.exe!ObfReferenceObject+0x99d
2, ntoskrnl.exe!KeWaitForSingleObject+0x1a3
3, ntoskrnl.exe!longjmp+0x1c470
4, Ntfs.sys+0x9bd48
5, fltmgr.sys+0x1102
6, fltmgr.sys!FltIsCallbackDataDirty+0x23ba
7, fltmgr.sys!FltDeletePushLock+0x3ee
8, ntoskrnl.exe!NtWriteFile+0x45f
9, ntoskrnl.exe!longjmp+0x5bf3
10, ntdll.dll!ZwWriteFile+0xa
11, KernelBase.dll!WriteFile+0x7b
12, kernel32.dll!WriteFile+0x36
13, DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr) + 0xc8 <-- mscorlib.ni.dll+0x63c9e8
14, System.IO.FileStream.WriteFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, System.Threading.NativeOverlapped*, Int32 ByRef) + 0x83 <-- mscorlib.ni.dll+0x5ad683
15, System.IO.FileStream.WriteCore(Byte[], Int32, Int32) + 0x5d <-- mscorlib.ni.dll+0x5ad5dd
16, DiscUtils.Vmdk.HostedSparseExtentStream.Write(Byte[], Int32, Int32) + 0x12c <-- 0x7fe852b360c
17, LTR.IO.ImDisk.Devio.Server.Providers.DevioProviderFromStream.Write(Byte[], Int32, Int32, Int64) + 0x3e <-- 0x7fe852b34ae
18, LTR.IO.ImDisk.Devio.Server.Providers.DevioProviderManagedBase.Write(IntPtr, Int32, Int32, Int64) + 0x6b <-- 0x7fe852b343b
19, LTR.IO.ImDisk.Devio.Server.Services.DevioShmService.WriteData(System.Runtime.InteropServices.SafeBuffer) + 0x175 <-- 0x7fe852b2fa5
20, LTR.IO.ImDisk.Devio.Server.Services.DevioShmService.RunService() + 0x509 <-- 0x7fe852b17a9
21, LTR.IO.ImDisk.Devio.Server.Services.DevioServiceBase.ServiceThreadProcedure() + 0x24 <-- 0x7fe852b0e24
22, System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) + 0x172 <-- mscorlib.ni.dll+0x58df12
23, System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) + 0x15 <-- mscorlib.ni.dll+0x58dd95
24, System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) + 0x55 <-- mscorlib.ni.dll+0x58dd65
25, System.Threading.ThreadHelper.ThreadStart() + 0x55 <-- mscorlib.ni.dll+0x633ea5
26, clr.dll!LogHelp_LogAssert+0x1f13
27, clr.dll!LogHelp_LogAssert+0x1e28
28, clr.dll!LogHelp_LogAssert+0x2690
29, clr.dll!ClrCreateManagedInstance+0x20bf
30, clr.dll!LogHelp_LogAssert+0x3540
31, clr.dll!LogHelp_LogAssert+0x34b3
32, clr.dll!LogHelp_LogAssert+0x33f2
33, clr.dll!LogHelp_LogAssert+0x35cf
34, clr.dll!ClrCreateManagedInstance+0x1fa9
35, clr.dll!LogHelp_LogAssert+0x68c5
36, kernel32.dll!BaseThreadInitThunk+0xd
37, ntdll.dll!RtlUserThreadStart+0x1d
How to reproduce:
I have reproduced it on both .vdi (fastes coping) and .vmdk (slower, the stack trace is taken from). The .vhd is too slow to reach the 50GB point (< 10MB/s on any files) and might be not affected because of slowness (I feel there is might be some kind of a race condition with high speed writes).
Hello!
When installation comes to the point of installing the inf file a message box with text "Installation failed." pops up. The installer, the script in zip file, and choosing the "Install" option when clicking on the inf file all fail with this error. All attempts were performed with administrator privileges. Files were downloaded from https://www.ltr-data.se/
Manually loading the drivers via the sc create
and sc start
and executing the corresponding cpl file works though, I have managed to get them all to load that way and create partition in RAM.
Not sure if that matters, but the system is a guest OS in a virtual machine which is disconnected from the Internet.
When pc - Windows 11 23H2 22631.3374 - starts, a 2 GB virtual disk is automatically created. The task manager shows that 2 GB of memory is allocated for the system process.
I only need the R disk, without the virtual disk. Deleting the virtual disk does not help, after turning on the computer, it is restored again.
ImDisk 2.1.1
I deleted "0_*" in the registry and the virtual disk stopped being created.
Hello,
I am exploring ImDisk for use in a potential project and think that it is really an amazing piece of work from the testing that I have done so far.
In addition to using it as a normal RAMDISK, I also have some ideas on how it might be used as part of a specialized IPC communication channel across independent applications written in different languages as well as for some other exciting work that I am trying to do as well.
On thing that I was wondering is that I know ImDisk can save images since I was playing with the ImDisk TK (toolkit) but was wondering if there might be some type of compression settings so that upon saving the image then it would be compressed and upon loading then it would be decompressed.
The other question is that I would like to investigate if there was any type of encryption functionality already built into ImDisk as that is a feature that I would like to use, but if it is not then maybe I could investigate adding it in some way but wanted to check first.
Truly awesome work you have done along with the original developer and it still holds great potential for a lot of good use.
Thanks and have a great day.
I'm running ImDisk on a Windows Server2022 machine that someone else is using remotely.
I use the command line: imdisk -a -s 4G -m R: -p "/fs:ntfs /q /y"
to create an R disk and it works fine. This is a great tool !
I want this R disk can only be used by me, no one else can see. Can it be done? Thank you.
When I access the mounted volume and then try to unmount it, sometimes it says access denied and I'm unable to do so, even though I'm not using the volume anymore. The only option in such a case is to restart my computer. What could be the problem?
Most programs allow creation of shortcut/entry on task bar. But it won't allow for imdisk. It would be great to have it on taskbar as shortcut if possible.
Thanks for the wonderful tool.
When using the ImDisk driver with a file image proxy tool like DiskUtilsDevio.exe from the ImDiskTK package
writing a lot of files to a 10GB image I can reliably dead lock the entire system (windows 10 22H2 x64)
I attached a stack trace of the worker thread of the DiskUtilsDevio.exe utility.
Inspecting the stack trace of cmd.exe which I used to copy files to the virtual disk, its hanging at the same time in
ntoskrnl.exe!CcCanIWrite
Ntfs.sys!NtfsCopyWriteA
And shortly there after the entire system becomes unresponsive and needs to be hard reset.
|#| |Symbol| |Stack address| |Frame address| |Control address| |Return address| |Stack parameters| |File info|
0 systeminformer.sys+0x148d5 0x0000000000000000 0x0000000000000000 0xfffff803981c48d5 0x0000000000000000 0x0 0x0 0x0 0x0
1 systeminformer.sys+0x15674 0x0000000000000000 0x0000000000000000 0xfffff803981c5674 0x0000000000000000 0x0 0x0 0x0 0x0
2 ksi.dll!KsiInsertQueueApc+0xbd 0x0000000000000000 0x0000000000000000 0xfffff803981d11ed 0x0000000000000000 0x0 0x0 0x0 0x0
3 ntoskrnl.exe!KiDeliverApc+0x1b0 0x0000000000000000 0x0000000000000000 0xfffff80375280800 0x0000000000000000 0x0 0x0 0x0 0x0
4 ntoskrnl.exe!KiSwapThread+0x827 0x0000000000000000 0x0000000000000000 0xfffff8037527e697 0x0000000000000000 0x0 0x0 0x0 0x0
5 ntoskrnl.exe!KiCommitThreadWait+0x14f 0x0000000000000000 0x0000000000000000 0xfffff8037527d89f 0x0000000000000000 0x0 0x0 0x0 0x0
6 ntoskrnl.exe!KeWaitForSingleObject+0x233 0x0000000000000000 0x0000000000000000 0xfffff8037527d143 0x0000000000000000 0x0 0x0 0x0 0x0
7 ntoskrnl.exe!CcCanIWrite+0x1b00e6 0x0000000000000000 0x0000000000000000 0xfffff80375477286 0x0000000000000000 0x0 0x0 0x0 0x0
8 Ntfs.sys!NtfsCopyWriteA+0x102 0x0000000000000000 0x0000000000000000 0xfffff8037b6eb232 0x0000000000000000 0x0 0x0 0x0 0x0
9 FLTMGR.SYS!FltpPerformFastIoCall+0x16c 0x0000000000000000 0x0000000000000000 0xfffff8037a3277fc 0x0000000000000000 0x0 0x0 0x0 0x0
10 FLTMGR.SYS!FltpPassThroughFastIo+0x10a 0x0000000000000000 0x0000000000000000 0xfffff8037a32460a 0x0000000000000000 0x0 0x0 0x0 0x0
11 FLTMGR.SYS!FltpFastIoWrite+0x165 0x0000000000000000 0x0000000000000000 0xfffff8037a359595 0x0000000000000000 0x0 0x0 0x0 0x0
12 ntoskrnl.exe!NtWriteFile+0x43d 0x0000000000000000 0x0000000000000000 0xfffff8037567d6cd 0x0000000000000000 0x0 0x0 0x0 0x0
13 ntoskrnl.exe!KiSystemServiceCopyEnd+0x25 0x0000000000000000 0x0000000000000000 0xfffff8037540d8f5 0x0000000000000000 0x0 0x0 0x0 0x0
14 ntdll.dll!NtWriteFile+0x14 0x000000001a2cea88 0x000000001a2cea80 0x00007ffbe95ed1c4 0x00007ffbe7125136 0x7ffbd4026cdf 0x1a2ce958 0x1a2ce988 0x0
15 KernelBase.dll!WriteFile+0x76 0x000000001a2cea90 0x000000001a2ceaf0 0x00007ffbe7125136 0x00007ffbd130c9c8 0x100000 0x0 0x1a2cec18 0x1a2cec18
16 mscorlib.ni.dll!DomainNeutralILStubClass.IL_STUB_PInvoke(SECURITY_ATTRIBUTES, Boolean, Boolean, System.String)$##6000000+0x2c8 0x000000001a2ceb00 0x000000001a2cebd0 0x00007ffbd130c9c8 0x00007ffbd127d663 0x1804128 0x0 0x1804088 0x0
17 mscorlib.ni.dll!System.IO.FileStream.WriteFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, System.Threading.NativeOverlapped*, Int32 ByRef)$##6001884+0x83 0x000000001a2cebe0 0x000000001a2cec30 0x00007ffbd127d663 0x00007ffbd127d5bd 0x0 0x7ffbd127d42d 0x1a2cf210 0x1a371000
18 mscorlib.ni.dll!System.IO.FileStream.WriteCore(Byte[], Int32, Int32)$##6001876+0x5d 0x000000001a2cec40 0x000000001a2ceca0 0x00007ffbd127d5bd 0x00007ffb74b6f0fe 0x7ffbd40af42f 0x1a2ceb58 0x1a2ceba8 0x0
19 0x7ffb74b6f0fe 0x000000001a2cecb0 0x000000001a2cecf0 0x00007ffb74b6f0fe 0x00007ffb74b6f08b 0x1a371000 0x100000 0x0 0x100000
20 0x7ffb74b6f08b 0x000000001a2ced00 0x000000001a2ced50 0x00007ffb74b6f08b 0x00007ffb74b6ebf5 0x100000 0x1a2cee90 0xfffffffffffffffe 0x100000
21 0x7ffb74b6ebf5 0x000000001a2ced60 0x000000001a2ceed0 0x00007ffb74b6ebf5 0x00007ffb74b6d3f9 0x1806410 0x1806410 0x4 0x7ffbd3f90000
22 0x7ffb74b6d3f9 0x000000001a2ceee0 0x000000001a2cef90 0x00007ffb74b6d3f9 0x00007ffb74b6c824 0x18057b0 0x18c65e8 0x1a2cf010 0x0
23 0x7ffb74b6c824 0x000000001a2cefa0 0x000000001a2cefd0 0x00007ffb74b6c824 0x00007ffbd125df12 0x18057b0 0x18c65e8 0x1a2cf010 0x0
24 mscorlib.ni.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AF0+0x172 0x000000001a2cefe0 0x000000001a2cf0a0 0x00007ffbd125df12 0x00007ffbd125dd95 0x18c6730 0x18c66b0 0x18c6688 0x0
25 mscorlib.ni.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)$##6003AEF+0x15 0x000000001a2cf0b0 0x000000001a2cf0d0 0x00007ffbd125dd95 0x00007ffbd125dd65 0x18c6688 0x0 0xd0d74430 0x0
26 mscorlib.ni.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)$##6003AEE+0x55 0x000000001a2cf0e0 0x000000001a2cf120 0x00007ffbd125dd65 0x00007ffbd1303e85 0x1a2cf288 0x1a2cf288 0x1a2cf190 0x0
27 mscorlib.ni.dll!System.Threading.ThreadHelper.ThreadStart()$##6003C01+0x55 0x000000001a2cf130 0x000000001a2cf160 0x00007ffbd1303e85 0x00007ffbd4026993 0x18c66f0 0x7ffbd0d74430 0x7ffbd0ebc4b8 0x0
28 clr.dll!CallDescrWorkerInternal+0x83 0x000000001a2cf170 0x000000001a2cf1a0 0x00007ffbd4026993 0x00007ffbd40268a0 0x1a2cf448 0x7ffbd4027438 0x0 0x7ffbd4027386
29 clr.dll!CallDescrWorkerWithHandler+0x4e 0x000000001a2cf1b0 0x000000001a2cf1e0 0x00007ffbd40268a0 0x00007ffbd4027150 0x1 0x1a2cf550 0x1a2cf380 0x1a2cf448
30 clr.dll!MethodDescCallSite::CallTargetWorker+0xfa 0x000000001a2cf1f0 0x000000001a2cf2e0 0x00007ffbd4027150 0x00007ffbd41b3ebf 0x1a2cf7e0 0x1 0x7ffbd0d74430 0x1
31 clr.dll!ThreadNative::KickOffThread_Worker+0xfffffffffffff02f 0x000000001a2cf2f0 0x000000001a2cf540 0x00007ffbd41b3ebf 0x00007ffbd4027d38 0x18c66f0 0x7ffbd41b4e90 0x1a2cf720 0x7ffbd402d217
32 clr.dll!ManagedThreadBase_DispatchInner+0x40 0x000000001a2cf550 0x000000001a2cf580 0x00007ffbd4027d38 0x00007ffbd4027ca3 0x1a2cf720 0xde83f0 0x0 0x7ffbd40253f1
33 clr.dll!ManagedThreadBase_DispatchMiddle+0x6c 0x000000001a2cf590 0x000000001a2cf680 0x00007ffbd4027ca3 0x00007ffbd4027be2 0x1a2cf720 0x0 0x0 0x0
34 clr.dll!ManagedThreadBase_DispatchOuter+0x4c 0x000000001a2cf690 0x000000001a2cf6f0 0x00007ffbd4027be2 0x00007ffbd4027dd3 0xffffffffffffffff 0xde83f0 0x1a2cf6e0 0xd41b90
35 clr.dll!ManagedThreadBase_FullTransitionWithAD+0x2f 0x000000001a2cf700 0x000000001a2cf750 0x00007ffbd4027dd3 0x00007ffbd41b3da9 0xde83f0 0x1 0x1 0x3
36 clr.dll!ThreadNative::KickOffThread+0xe6 0x000000001a2cf760 0x000000001a2cf830 0x00007ffbd41b3da9 0x00007ffbd402b8b5 0xdf06e0 0x1 0xde83f0 0x1a2cf7b8
37 clr.dll!Thread::intermediateThreadProc+0x8b 0x000000001a2cf840 0x000000001a2cf970 0x00007ffbd402b8b5 0x00007ffbe9247614 0x0 0x0 0x0 0x0
38 kernel32.dll!BaseThreadInitThunk+0x14 0x000000001a2cf980 0x000000001a2cf9a0 0x00007ffbe9247614 0x00007ffbe95a26a1 0x0 0x0 0x0 0x0
39 ntdll.dll!RtlUserThreadStart+0x21 0x000000001a2cf9b0 0x000000001a2cfa20 0x00007ffbe95a26a1 0x0000000000000000 0x0 0x0 0x0 0x0
Hi, I'm sorry about the undescriptive bug report title, but I couldn't think of anything better.
A while ago I filed a report at ImDisk Toolkit's tracker, through which I'm using the ImDisk driver.
Basically, I have setup a RAM disk that's always recreated at startup with user temporary directories pointing to it (i.e., R:\Temp), 8 GB, using AWE and being dynamic in terms of memory. It works great most of the times, but some applications seem to have a hard time working with it.
These are some of the error messages that are shown:
The first one belongs to the current graphic driver installer from Intel, it states that the application is in an unauthorized location, whatever that means. Also from Intel, their oneAPI compiler package installer complains X MB of space are needed, even when it was virtually empty. In both cases I had to move things out of the RAM disk for them to work.
The behavior is similar in a way to what I encountered years ago when Process Hacker was updating and %TEMP% pointed to inside the RAM disk, I reported it over at their forums, and their developer kind of explained what the problem was, so I could report it properly, but I completely forgot about it. The reply is here, in case it's still relevant (it seems to have to do with IOCTLs): https://wj32.org/processhacker/forums/viewtopic.php?t=3419#p10644
I don't know if you guys are aware of the issue(s), but I just stumbled upon this project here and seeing there seems to be active development I thought of referencing it here too. The third picture belongs to another case that exhibits the same behavior, I had to temporarily switch the TEMP environmental variables to a real disk to be able to continue with that installation.
Could you please look into it? Don't hesitate to let me know if you need more data samples, or you want logs of some sort, I would gladly do trial and error for you with debug builds of the driver. It needn't be signed, I could self sign them and make sure Windows trusts that signature to do the testing, or enable installation of unsigned drivers for the tests.
Thank you for your time by the way.
Make it possible for the application to be multilingual.
Hi Olof,
I downloaded https://ltr-data.se/files/imdiskinst.exe from https://ltr-data.se/opencode.html/ (that's your site, correct?) the other day, and the site indicated it was v2.1.1, built on 2021-11-05 (IIRC). The download was 613KB.
I then returned to https://ltr-data.se/opencode.html/ a few hours ago, and it indicated the version number was still v2.1.1, but it now indicated it was built on 2021-11-07 (as opposed to 2021-11-05). The download size increased substantially to 641KB.
Also, 4 security vendors currently flag this file as malicious on virustotal.com, whereas the release from a couple days ago only currently has 1 malware flag.
Do you know what's going on?
Why is the download from https://ltr-data.se/opencode.html/ changing without the version number changing?
Also, why do none of the file timestamps match the build date?
Thank you for your help.
I wrote 2 scripts to mount/unmount:
mount.bat:
imdisk -a -f "d:\a\shared-store.vdi" -m "d:\a\shared-store"
unmount.bat:
imdisk -d -m "d:\a\shared-store"
The problem is that it can not mount nor unmount.
Some time ago it has mount/dismount correctly. But after that is something did happen and mounting now is broken.
The ProcessHacker
shows that the System holds the vdi file: shared-store.vdi
The mount.bat
reports access denied
on mount. The unmount.bat
reports that the file is not found. All scripts does execute under Administrator privileges.
If try to change the parameter from path d:\a\shared-store
to drive e:
, then the scripts reports almost the same.
If try to run MountImg.exe
it shows nothing mounted.
The same vdi file mounts correctly by the VirtualBox Guest instance. If try to stop the VM instance with the vdi file attached and run scripts again, then the issue happens again.
I read this issue but did't found a solution: #10
There is questions:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.