chuyu-team / yy-thunks Goto Github PK
View Code? Open in Web Editor NEWFix DecodePointer, EncodePointer,RegDeleteKeyEx etc. APIs not found in Windows XP RTM.
License: MIT License
Fix DecodePointer, EncodePointer,RegDeleteKeyEx etc. APIs not found in Windows XP RTM.
License: MIT License
问题简介:
我最近在开发一个需要兼容windows 2000的程序,在使用最新的代码编译出 YY_Thunks_for_Win2K.obj,然后链接它时会出现链接错误 error LNK2001: 无法解析的外部符号 ___YY_Thunks_Process_Terminating。
分析:
我这边看了一下源代码,看到该变量被定义在了pch.cpp中,而通过build.cmd进行构建时不会编译pch.cpp,故导致YY_Thunks.h里声明的__YY_Thunks_Process_Terminating 没有定义。
我这边试着去掉了 pch.cpp 里面的 __YY_Thunks_Process_Terminating 的定义,然后在YY_Thunks.cpp 第 124行 加上了
#if (YY_Thunks_Support_Version < NTDDI_WINXP)
EXTERN_C BOOL __YY_Thunks_Process_Terminating = 0;
#endif
解决了该问题
因为QT高版本不支持windows的低版本,比如,QT6不支持windows7,QT5.7以上不支持xp,如果使用msvc编译器的话,应该问题不大,但如果使用的是mingw编译器的话,不知道可以么?
这个函数仅Windows 8.0和以上可用,Windows 7没有,确认安装YY-Thunks依然没解决这个问题
相关issue:lx-s/WinMute#21
Any possiblity to implement it properly on XP?
请问一下dll库怎么使用?添加依赖后还是会找不到
在windows server 2003上出现该提示, YY_Thunks_for_WinXP.obj已经链接进去, 该怎么解决该问题, 或者自己该怎么修改源码?
我在 rust 中尝试使用这个库来兼容老版本的 xp 系统,编译时遇到这个问题,环境信息:
我做了一些尝试,比如添加 vcruntimelib
msvcrt.lib
等均没有作用,通过打印 verbose 日志,我发现 __wcsicmp
这个函数有被找到
感觉表现比较奇怪,来求助一下。
我的编译选项:
$env:RUSTFLAGS='-Ctarget-feature=+crt-static -Clink-args=/subsystem:console,5.01 -Clink-args=YY_Thunks_for_WinXP.obj -Clink-args=/verbose'
cargo build --target i686-pc-windows-msvc -v
代码是一个 hello word,感觉不是 rust 的问题
// main.rs
fn main() {
println!("hello world");
}
反馈者,清冷。
Hi, I make this topic more to make some questions,
I would like know what software have been test which works now with YY-Thunks in Windows XP, could be nice have some list with details and maybe screenshots even.
And.. I wonder also if possible even used with Windows 7, since now some software like Adobe Photosho 2021 (v22) and more recent 2020 (v21) have dropped Windows 7 support, where is not even possible to install.
Othe software without Windows 7 support now is VMware 16.x, this was solved thanks to archeYR (has a YouTube channel), but it might be nice to actually solve this too with something like YY-Thunks as well..
根据https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows,一些传统的函数有了新的能根据DPI调整的版本,比如GetSystemMetricsForDpi
、AdjustWindowRectExForDpi
和SystemParametersInfoForDpi
等。这些函数不仅不支持Win7~8.1,在低版本的Win10上也不存在。
lld-link 重复符号默认会报告错误,所以YY-Thunks提供修改后的 kernel32.lib ws2_32.lib和advapi.lib
支持这种使用场景
RegDeleteKeyExW
函数为例想法是,向kernel32.lib
注入YY-Thunks.obj
,然后提供符号YY_Thunks_RegDeleteKeyExW
再向advapi.lib注入WeakAlias,将RegDeleteKeyExW
符号自动转发到YY_Thunks_RegDeleteKeyExW
最终RegDeleteKeyExW就被链接器转换到kernel32.lib里的YY_Thunks_RegDeleteKeyExW(YY-Thunks.obj),完成这个链接时Hook。
flowchart TD;
RegDeleteKeyExW-->advapi.lib
advapi.lib-->WeakAlias
WeakAlias-->YY_Thunks_RegDeleteKeyExW
YY_Thunks_RegDeleteKeyExW-->kernel32.lib
kernel32.lib-->YY-Thunks.obj
Hello.
Tokio is an event-driven, non-blocking I/O platform for writing asynchronous applications with the Rust programming language.
I'm currently writing a small server-client application using the Tokio crate. I intended to write a very simple client with minimal dependencies, but it turns out that the core of my program - Tokio - already includes a few unresolved characters on Windows XP.
When I try to run the given program's executable on Win XP:
Cargo.toml:
[package]
...
[dependencies]
tokio = { version = "1", features = ["full"] }
src/main.rs:
#[tokio::main]
async fn main() { }
i get two unresolved characters - GetQueuedCompletionStatusEx (MS docs) in kernel32.dll and NtCancelIoFileEx (MS docs) in ntdll.dll.
And this program (an example of a simple TCP server from https://crates.io/crates/tokio):
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mutbuf = [0; 1024];
// In a loop, read data from the socket and write the data back.
loop {
let n = match socket.read(&mut buf).await {
// socket closed
Ok(n) if n == 0 => return,
Ok(n) => n,
Err(e) => {
eprintln!("failed to read from socket; err = {:?}", e);
return;
}
};
// Write the data back
if let Err(e) = socket.write_all(&buf[0..n]).await {
eprintln!("failed to write to socket; err = {:?}", e);
return;
}
}
});
}
}
adds one more unresolved symbol - SetFileCompletionNotificationModes (MS docs) in kernel32.dll
Is it possible to implement these functions?
Wine implementation of these functions:
I appreciate your work. Thanks.
At least:
//{ FOLDERID_Downloads, CSIDL_CDBURN_AREA },
//{ FOLDERID_PublicDownloads, CSIDL_CDBURN_AREA },
//Vista以后的Shell32.dll 有个 kfapi::GetFolderIdByCSIDL,我们可以根据它可以反推出出 下面的KnownFoldersIdToCSIDL
static int __fastcall KnownFoldersIdToCSIDL(const GUID& rfid)
{
constexpr static const KnownFoldersIdKey KnownFoldersIdsMap[] =
{
{ FOLDERID_Windows, CSIDL_WINDOWS },
{ FOLDERID_ProgramFilesCommon, CSIDL_PROGRAM_FILES_COMMON },
{ FOLDERID_PublicDesktop, CSIDL_COMMON_DESKTOPDIRECTORY },
{ FOLDERID_CDBurning, CSIDL_CDBURN_AREA },
{ FOLDERID_CommonStartMenu, CSIDL_COMMON_STARTMENU },
{ FOLDERID_Videos, CSIDL_MYVIDEO },
{ FOLDERID_ProgramFilesCommonX86, CSIDL_PROGRAM_FILES_COMMONX86 },
{ FOLDERID_ConnectionsFolder, CSIDL_CONNECTIONS },
{ FOLDERID_PrintersFolder, CSIDL_PRINTERS },
{ FOLDERID_Pictures, CSIDL_MYPICTURES },
{ FOLDERID_ResourceDir, CSIDL_RESOURCES },
{ FOLDERID_CommonStartup, CSIDL_COMMON_STARTUP /*等价CSIDL_COMMON_ALTSTARTUP*/},
{ FOLDERID_PublicVideos, CSIDL_COMMON_VIDEO },
{ FOLDERID_Desktop, CSIDL_DESKTOP /*等价CSIDL_DESKTOPDIRECTORY*/},
{ FOLDERID_History, CSIDL_HISTORY },
{ FOLDERID_SamplePictures, CSIDL_COMMON_PICTURES }, //做个兼容处理吧,反正都是放图片的
{ FOLDERID_RecycleBinFolder, CSIDL_BITBUCKET },
{ FOLDERID_CommonPrograms, CSIDL_COMMON_PROGRAMS },
{ FOLDERID_NetHood, CSIDL_NETHOOD },
{ FOLDERID_Cookies, CSIDL_COOKIES },
{ FOLDERID_LocalizedResourcesDir, CSIDL_RESOURCES_LOCALIZED },
{ FOLDERID_Favorites, CSIDL_FAVORITES /*等价于CSIDL_COMMON_FAVORITES*/},
{ FOLDERID_SampleMusic, CSIDL_COMMON_MUSIC }, //做个兼容处理吧,反正都是放音乐的
{ FOLDERID_SendTo, CSIDL_SENDTO },
{ FOLDERID_AdminTools, CSIDL_ADMINTOOLS },
{ FOLDERID_Music, CSIDL_MYMUSIC },
{ FOLDERID_InternetFolder, CSIDL_INTERNET },
{ FOLDERID_System, CSIDL_SYSTEM },
{ FOLDERID_Programs, CSIDL_PROGRAMS },
#ifdef _AMD64_
{ FOLDERID_ProgramFilesX64, CSIDL_PROGRAM_FILES }, //兼容下,反正 x64路径 跟 普通的是一样的。
#endif
{ FOLDERID_ComputerFolder, CSIDL_DRIVES },
{ FOLDERID_CommonAdminTools, CSIDL_COMMON_ADMINTOOLS },
{ FOLDERID_Recent, CSIDL_RECENT },
{ FOLDERID_ProgramData, CSIDL_COMMON_APPDATA },
{ FOLDERID_LocalAppData, CSIDL_LOCAL_APPDATA },
{ FOLDERID_PublicPictures, CSIDL_COMMON_PICTURES },
{ FOLDERID_PrintHood, CSIDL_PRINTHOOD },
{ FOLDERID_Profile, CSIDL_PROFILE },
{ FOLDERID_SampleVideos, CSIDL_COMMON_VIDEO }, //做个兼容处理吧,反正都是放视频的
{ FOLDERID_LocalAppDataLow, CSIDL_LOCAL_APPDATA }, //兼容下,直接用AppData
#ifdef _AMD64_
{ FOLDERID_ProgramFilesCommonX64, CSIDL_PROGRAM_FILES_COMMON }, //兼容下,反正 x64路径 跟 普通的是一样的。
#endif
{ FOLDERID_PublicDocuments, CSIDL_COMMON_DOCUMENTS },
{ FOLDERID_SystemX86, CSIDL_SYSTEMX86 },
{ FOLDERID_PublicMusic, CSIDL_COMMON_MUSIC },
{ FOLDERID_ProgramFiles, CSIDL_PROGRAM_FILES },
{ FOLDERID_Fonts, CSIDL_FONTS },
{ FOLDERID_Startup, CSIDL_STARTUP /*等效CSIDL_ALTSTARTUP*/},
{ FOLDERID_StartMenu, CSIDL_STARTMENU },
{ FOLDERID_NetworkFolder, CSIDL_NETWORK /*等效CSIDL_COMPUTERSNEARME*/},
{ FOLDERID_Documents, CSIDL_MYDOCUMENTS },
{ FOLDERID_CommonOEMLinks, CSIDL_COMMON_OEM_LINKS },
{ FOLDERID_RoamingAppData, CSIDL_APPDATA },
{ FOLDERID_CommonTemplates, CSIDL_COMMON_TEMPLATES },
{ FOLDERID_InternetCache, CSIDL_INTERNET_CACHE },
{ FOLDERID_Templates, CSIDL_TEMPLATES },
{ FOLDERID_ControlPanelFolder, CSIDL_CONTROLS },
{ FOLDERID_ProgramFilesX86, CSIDL_PROGRAM_FILESX86 },
//{ FOLDERID_SyncManagerFolder, CSIDL_PRINTERS },
//{ FOLDERID_SyncSetupFolder, CSIDL_PRINTERS },
//{ FOLDERID_ConflictFolder, CSIDL_PRINTERS },
//{ FOLDERID_SyncResultsFolder, CSIDL_PRINTERS },
//{ FOLDERID_UserProgramFiles, CSIDL_PROGRAM_FILES_COMMON },
//{ FOLDERID_UserProgramFilesCommon, CSIDL_PROGRAM_FILES_COMMON },
//{ FOLDERID_Ringtones, CSIDL_MYVIDEO },
//{ FOLDERID_PublicRingtones, CSIDL_COMMON_VIDEO },
//{ FOLDERID_UserProfiles, CSIDL_CDBURN_AREA },
//{ FOLDERID_Playlists, CSIDL_CDBURN_AREA },
//{ FOLDERID_SamplePlaylists, CSIDL_CDBURN_AREA },
//{ FOLDERID_PhotoAlbums, CSIDL_CDBURN_AREA },
//{ FOLDERID_Public, CSIDL_CDBURN_AREA },
//{ FOLDERID_ChangeRemovePrograms, CSIDL_CDBURN_AREA },
//{ FOLDERID_AppUpdates, CSIDL_CDBURN_AREA },
//{ FOLDERID_AddNewPrograms, CSIDL_CDBURN_AREA },
//{ FOLDERID_Downloads, CSIDL_CDBURN_AREA },
//{ FOLDERID_PublicDownloads, CSIDL_CDBURN_AREA },
//{ FOLDERID_SavedSearches, CSIDL_CDBURN_AREA },
//{ FOLDERID_QuickLaunch, CSIDL_CDBURN_AREA },
//{ FOLDERID_Contacts, CSIDL_CDBURN_AREA },
//{ FOLDERID_SidebarParts, CSIDL_CDBURN_AREA },
//{ FOLDERID_SidebarDefaultParts, CSIDL_CDBURN_AREA },
//{ FOLDERID_PublicGameTasks, CSIDL_CDBURN_AREA },
//{ FOLDERID_GameTasks, CSIDL_CDBURN_AREA },
//{ FOLDERID_SavedGames, CSIDL_CDBURN_AREA },
//{ FOLDERID_Games, CSIDL_CDBURN_AREA },
//{ FOLDERID_SEARCH_MAPI, CSIDL_CDBURN_AREA },
//{ FOLDERID_SEARCH_CSC, CSIDL_CDBURN_AREA },
//{ FOLDERID_Links, CSIDL_CDBURN_AREA },
//{ FOLDERID_UsersFiles, CSIDL_CDBURN_AREA },
//{ FOLDERID_UsersLibraries, CSIDL_CDBURN_AREA },
//{ FOLDERID_SearchHome, CSIDL_CDBURN_AREA },
//{ FOLDERID_OriginalImages, CSIDL_CDBURN_AREA },
//{ FOLDERID_DocumentsLibrary, CSIDL_CDBURN_AREA },
//{ FOLDERID_MusicLibrary, CSIDL_CDBURN_AREA },
//{ FOLDERID_PicturesLibrary, CSIDL_CDBURN_AREA },
//{ FOLDERID_VideosLibrary, CSIDL_CDBURN_AREA },
//{ FOLDERID_RecordedTVLibrary, CSIDL_CDBURN_AREA },
//{ FOLDERID_HomeGroup, CSIDL_CDBURN_AREA },
//{ FOLDERID_HomeGroupCurrentUser, CSIDL_CDBURN_AREA },
//{ FOLDERID_DeviceMetadataStore, CSIDL_CDBURN_AREA },
//{ FOLDERID_Libraries, CSIDL_CDBURN_AREA },
//{ FOLDERID_PublicLibraries, CSIDL_CDBURN_AREA },
//{ FOLDERID_UserPinned, CSIDL_CDBURN_AREA },
//{ FOLDERID_ImplicitAppShortcuts, CSIDL_CDBURN_AREA },
//{ FOLDERID_AccountPictures, CSIDL_CDBURN_AREA },
//{ FOLDERID_PublicUserTiles, CSIDL_CDBURN_AREA },
//{ FOLDERID_AppsFolder, CSIDL_CDBURN_AREA },
//{ FOLDERID_StartMenuAllPrograms, CSIDL_CDBURN_AREA },
};
请求添加 SetWaitableTimerEx 实现
Python 3.11 用到了这个 SetWaitableTimerEx
暂时的,我们只实现2019 CRT必须的API,其他后续想办法补充。也欢迎提交PR。
After some struggle #47, I was finally able to run a hello world program in windows XP, but there are still some errors before I can actually use it.
If I place a fake bcrypt.dll inside the folder, there will be other errors.
So we need to add at least these APIs.
// bcrypt.dll
BCryptCloseAlgorithmProvider
BCryptOpenAlgorithmProvider
BCryptGenRandom
// ntdll.dll
EtwTraceMessage
I'm almost ready to give up on xp support, there are too much trouble :(
之前为了解决Bug #7, 特意在Init时加载了所有的try_get_, _FUNCTION
。这导致某些场景,这可能调用数百次,拖慢速度。
理论上,所有Load dll工作可能再复杂的场景死锁。但是我们其实只需要调用 try_get_module_, _MODULE
。
try_get_, _FUNCTION
中只是多了GetProcAddress
,但是GetProcAddress
并不会引入锁。
所以改成 try_get_module_, _MODULE
这可以减少无意义的GetProcAddress
次数。
理论上没有风险。但是对初始化影响较大,不确定是否产生其他意外情况。
脚本:通过使用utf8编码,以及chcp 65001,支持含有中文的脚本;注释使用@Rem,::在一些地方用会导致问题。
脚本:
有以下问题:
C:\Code\Github_com\YY-Thunks>cl /O1 /Os /Oi /GS- /arch:IA32 /Z7 /MT /Fo"objs\\x86\\YY_Thunks_for_WinXP.obj" /Zl /c /D "NDEBUG" /D "YY_Thunks_Support_Version=NTDDI_WINXP" "C:\Code\Github_com\YY-Thunks\src\YY_Thunks.cpp"
用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.16.27032.1 版
版权所有(C) Microsoft Corporation。保留所有权利。
YY_Thunks.cpp
C:\Code\Github_com\YY-Thunks\src\YY_Thunks.cpp : fatal error C1083: 无法打开编译器生成的文件: “C:\Code\Github_com\YY-Thunks\objs\x86\YY_Thunks_for_WinXP.obj”: No such file or directory
原因在于VS不会自动为/Fo选项指定的路径创建目录,需提前创建好此目录。
pro配置如下:
#----------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = hello
TEMPLATE = app
win32 {
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01
DEFINES += ATL_XP_TARGETING
QMAKE_CFLAGS += /D_USING_V120_SDK71
QMAKE_CXXFLAGS += /D_USING_V120_SDK71_
LIBS *= -L"%Program Files (x86)%/Microsoft SDKs/Windows/7.1A/Lib"
INCLUDEPATH += "%Program Files (x86)%/Microsoft SDKs/Windows/7.1A/Include"
QMAKE_TARGET_OS = xp
QMAKE_LIBDIR += $$PWD/objs/x86
LIBS += YY_Thunks_for_WinXP.obj
}
SOURCES += main.cpp
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
#----------------------------
使用的是YY-Thunks-1.0.6-Binary,报错如下,
YY_Thunks_for_WinXP.obj : error LNK2019: 无法解析的外部符号 __imp__GetSystemMetrics@4,该符号在函数 _GetSystemMetricsForDpi@8 中被引用
YY_Thunks_for_WinXP.obj : error LNK2019: 无法解析的外部符号 __imp__GetDC@4,该符号在函数 "unsigned int __fastcall YY::Thunks::internal::GetDpiForSystemDownlevel(void)" (?GetDpiForSystemDownlevel@internal@Thunks@YY@@Yiixz) 中被引用
YY_Thunks_for_WinXP.obj : error LNK2019: 无法解析的外部符号 __imp__ReleaseDC@8,该符号在函数 "unsigned int __fastcall YY::Thunks::internal::GetDpiForSystemDownlevel(void)" (?GetDpiForSystemDownlevel@internal@Thunks@YY@@Yiixz) 中被引用
YY_Thunks_for_WinXP.obj : error LNK2019: 无法解析的外部符号 __imp__AdjustWindowRectEx@16,该符号在函数 _AdjustWindowRectExForDpi@20 中被引用
YY_Thunks_for_WinXP.obj : error LNK2019: 无法解析的外部符号 __imp__SystemParametersInfoW@16,该符号在函数 _SystemParametersInfoForDpi@20 中被引用
YY_Thunks_for_WinXP.obj : error LNK2019: 无法解析的外部符号 __imp__MonitorFromWindow@8,该符号在函数 _GetDpiForWindow@4 中被引用
release\hello.exe : fatal error LNK1120: 6 个无法解析的外部命令
Winelib 用户手册
https://wiki.winehq.org/Winelib_User%27s_Guide
Winelib 是一个开发工具包,它使您可以在 Unix 上编译 Windows 应用程序。
反馈者 zeroclear
都是ntdll的函数
尝试编译 https://github.com/xupefei/Locale-Emulator-Core 到XP上运行时发现的
感谢
GetFileInformationByHandleEx(FileRemoteProtocolInfo)最终转换成NtQueryInformationFile(FileRemoteProtocolInformation),但XP只支持编号小于41的功能,导致返回FALSE,错误号为ERROR_INVALID_PARAMETER(STATUS_INVALID_INFO_CLASS)
https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_remote_protocol_info
MSDN上也说了这个功能最低要Win7,建议在文档或注释里做一下说明
模块应该是api_ms_win_core_synch_l1_2_0,不应是 kernel32
反馈者:倾城流浪
Vsitual Studio 2017 + Windows XP模式 + MT
运行环境:Windows 7 x64
死锁场景:
线程A:Thread创建回调 -->DLL Load锁定 --> tdp初始化 --> 等待locale锁
线程B:locale锁定 --> _Atexit --> EncodePointer(YY-Thunks) --> 等待 DLL Load锁
Dear Chuyu-Team:
https://msdn.microsoft.com/en-us/library/ms724921(VS.85).aspx
https://msdn.microsoft.com/en-us/library/ms724848(v=vs.85).aspx
Minimum supported client | Windows Vista [desktop apps only]
这两个API没有Ex结尾,以为XP能用,结果坑了我好久
Best Regards!
我在尝试用 VC6 链接 Rust 程序, 使用 Windows Server 2003 SP2 Platform SDK 加上 YY-Truncks v1.0.7-Beta4 编译, 出现如题报错,自行在代码中定义相应函数后不再报错。
根据 SHSetFolderPathW 的文档,它应该在 Windows Server 2003 Platform SDK 里,此处不知道为何报错找不到。
如题,能否补充一下对该函数的兼容
PdhAddEnglishCounter XP下替代API PdhAddCounter,参数一致
使用过程当中 RtlpWakeByAddress 会有卡死的情况:
这个感觉应该放到 for 循环内
Originally posted by @qiudaowen in #20 (comment)
After i compiled Visual Studio .sln File ,
It generated YY-Thunks.UnitTest.lib, YY-Thunks.UnitTest.exp,YY-Thunks.UnitTest.dll
How to get OBJ file for XP?
如题,这个项目能和VC-LTL一起使用吗?
另外再问一下,自述文件里只讲了VS的操作方法,用CMake的项目该怎么操作?
我改了一下,改成
DWORD lStatus = Status == STATUS_TIMEOUT ? WAIT_TIMEOUT : pRtlNtStatusToDosError ? pRtlNtStatusToDosError(Status) : Status;
下面这样了,你可以再斟酌下。
截至2023年7月8日,此列表更新为Chrome 116内核API缺失的情况。打勾则表明已经支持。
目前,此任务的优先级比较低,某些API完整的支持投入人力也比较惊人,也欢迎大家提供PR。
能否添加EnumResourceLanguagesExW的实现?
为 RoInitialize、RoUninitialize提供 Fallback
其他WinRT的参数返回再修正一下,让他更合理。
应该返回!InterlockedBitTestAndSet。
EventRegister
EventUnregister
EventWrite
EventWriteTransfer
EventWriteEx
EventSetInformation
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.