int wmain(int argc, wchar_t *argv[]) { // // 打印当前操作系统的名字. // wchar_t szName[512]; if (GetOSName(szName, ARRAYSIZE(szName))) { setlocale(LC_CTYPE, ""); wprintf(L"当前的操作系统: %s\n", szName); } else { wprintf(L"无法获得操作系统名字\n"); } // // 打印当前操作系统的版本字符串. // wchar_t szVersionString[512]; if (GetOSVersionString(szVersionString, ARRAYSIZE(szVersionString))) { wprintf(L"版本: %s\n", szVersionString); } else { wprintf(L"无法获得操作系统版本\n"); } // // 确定当前操作系统是否是64位. // BOOL f64bitOS = Is64BitOS(); wprintf(L"当前的操作系统是 %s64位\n", f64bitOS ? L"" : L"不是"); // // 确定当前的进程是否是64位的. // BOOL f64bitProc = Is64BitProcess(); wprintf(L"当前的进程是 %s64位\n", f64bitProc ? L"" : L"不是 "); // // 确定运行在系统中的任意一个进程是否是64位进程. // if (argc > 1) { // 如果一个进程ID在命令行中被指定,则获取进程ID,并打开进程句柄. DWORD dwProcessId = _wtoi(argv[1]); if (dwProcessId != 0 /*conversion succeeds*/) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId); if (hProcess != NULL) { // 检测指定进程是否是64位. BOOL f64bitProc = Is64BitProcess(hProcess); wprintf(L"进程 %d 是 %s64-bit\n", dwProcessId, f64bitProc ? L"" : L"不是 "); CloseHandle(hProcess); } else { wprintf(L"打开进程(%d) 失败 w/err 0x%08lx\n", dwProcessId, GetLastError()); } } else { wprintf(L"无效的进程 ID: %s\n", argv[1]); } } return 0; }
BOOL CALLBACK InfoDialogBoxProc( HWND hWnd, UINT wmes, UINT wparam, LONG lparam ) { int i; switch( wmes ){ case WM_INITDIALOG: { char buf[1024]; int device=0; CheckCPU(); buf[0]='\0'; strcatfn( buf, "VenderID %s", szVenderID ); strcatfn( buf, "TypeID %d, FamilyID %d, ModelID %d, SteppingID %d", TypeID, FamilyID, ModelID, SteppingID); strcatfn( buf, "%s", szCpuName ); strcatfn( buf, "CpuClock実測値 %dMHz", fCpuClock ); strcatfn( buf, "MMX %s", (MMX_Flag)?"有":"無" ); strcatfn( buf, "SSE %s", (SSE_FP_Flag)?"有":"無" ); strcatfn( buf, "SSE2 %s", (SSE2_Flag)?"有":"無" ); strcatfn( buf, "3DNow! %s", (_3DNow_Flag)?"有":"無" ); strcatfn( buf, "e3DNow! %s", (_3DNowExt_Flag)?"有":"無" ); strcatfn( buf, "" ); device = EnumGraphicsDevice( ); for( i=0 ; i<device ; i++ ){ strcatfn( buf, "VideoCard(%d) %s", i+1, GetGraphicsDeviceName(i) ); } device = EnumSoundDevice(); for( i=0 ; i<device ; i++ ){ strcatfn( buf, "SoundCard(%d) %s", i+1, GetSoundDeviceName(i) ); } strcatfn( buf, "" ); strcatfn( buf, "OS %s", GetOSName() ); SetDlgItemText( hWnd, IDC_EDIT1, buf ); LOGFONT logfont; hFontLink=(HFONT)SendMessage(GetDlgItem(hWnd,IDC_WWW),WM_GETFONT,0,0); GetObject(hFontLink,sizeof(logfont),&logfont); logfont.lfUnderline=1; hFontLink=CreateFontIndirect(&logfont); SendDlgItemMessage(hWnd,IDC_WWW,WM_SETFONT,(WPARAM)hFontLink,0); oldLinkProc = (WNDPROC)GetWindowLong(GetDlgItem(hWnd,IDC_WWW),GWL_WNDPROC); SetWindowLong(GetDlgItem(hWnd,IDC_WWW),GWL_WNDPROC,(LONG)linkProc); return TRUE; } break; case WM_COMMAND: switch( LOWORD( wparam ) ){ case IDC_WWW: if(HIWORD(wparam) == STN_CLICKED){ char szTextTmp[100]; GetDlgItemText(hWnd,LOWORD(wparam),szTextTmp,100); ShellExecute(hWnd,NULL,szTextTmp,NULL,NULL,SW_SHOWNORMAL); } break; } break; case WM_DESTROY: DeleteObject(hFontLink); break; } return FALSE; } // InfoDialogBoxProc
HRESULT CoreClrEmbedding::Initialize(BOOL debugMode) { // Much of the CoreCLR bootstrapping process is cribbed from // https://github.com/aspnet/dnx/blob/dev/src/dnx.coreclr.unix/dnx.coreclr.cpp DBG("CoreClrEmbedding::Initialize - Started") HRESULT result = S_OK; char currentDirectory[PATH_MAX]; #ifdef EDGE_PLATFORM_WINDOWS if (!_getcwd(¤tDirectory[0], PATH_MAX)) #else if (!getcwd(¤tDirectory[0], PATH_MAX)) #endif { throwV8Exception("Unable to get the current directory."); return E_FAIL; } char edgeNodePath[PATH_MAX]; #ifdef EDGE_PLATFORM_WINDOWS HMODULE moduleHandle = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR) &CoreClrEmbedding::Initialize, &moduleHandle); GetModuleFileName(moduleHandle, edgeNodePath, PATH_MAX); PathRemoveFileSpec(edgeNodePath); #else Dl_info dlInfo; dladdr((void*)&CoreClrEmbedding::Initialize, &dlInfo); strcpy(edgeNodePath, dlInfo.dli_fname); strcpy(edgeNodePath, dirname(edgeNodePath)); #endif DBG("CoreClrEmbedding::Initialize - edge.node path is %s", edgeNodePath); void* libCoreClr = NULL; char bootstrapper[PATH_MAX]; GetPathToBootstrapper(&bootstrapper[0], PATH_MAX); DBG("CoreClrEmbedding::Initialize - Bootstrapper is %s", bootstrapper); char coreClrDirectory[PATH_MAX]; char* coreClrEnvironmentVariable = getenv("CORECLR_DIR"); if (coreClrEnvironmentVariable) { if (coreClrEnvironmentVariable[0] == '"') { strncpy(&coreClrDirectory[0], &coreClrEnvironmentVariable[1], strlen(coreClrEnvironmentVariable) - 2); coreClrDirectory[strlen(coreClrEnvironmentVariable) - 2] = '\0'; } else { strncpy(&coreClrDirectory[0], coreClrEnvironmentVariable, strlen(coreClrEnvironmentVariable) + 1); } DBG("CoreClrEmbedding::Initialize - Trying to load %s from the path specified in the CORECLR_DIR environment variable: %s", LIBCORECLR_NAME, coreClrDirectory); LoadCoreClrAtPath(coreClrDirectory, &libCoreClr); } if (!libCoreClr) { strncpy(&coreClrDirectory[0], currentDirectory, strlen(currentDirectory) + 1); LoadCoreClrAtPath(coreClrDirectory, &libCoreClr); } if (!libCoreClr) { // Try to load CoreCLR from application path #ifdef EDGE_PLATFORM_WINDOWS char* lastSlash = strrchr(&bootstrapper[0], '\\'); #else char* lastSlash = strrchr(&bootstrapper[0], '/'); #endif assert(lastSlash); strncpy(&coreClrDirectory[0], &bootstrapper[0], lastSlash - &bootstrapper[0]); coreClrDirectory[lastSlash - &bootstrapper[0]] = '\0'; LoadCoreClrAtPath(coreClrDirectory, &libCoreClr); } if (!libCoreClr) { std::string pathEnvironmentVariable = getenv("PATH"); #if EDGE_PLATFORM_WINDOWS char delimeter = ';'; #else char delimeter = ':'; #endif size_t previousIndex = 0; size_t currentIndex = pathEnvironmentVariable.find(delimeter); while (!libCoreClr && currentIndex != std::string::npos) { strncpy(&coreClrDirectory[0], pathEnvironmentVariable.substr(previousIndex, currentIndex - previousIndex).c_str(), currentIndex - previousIndex); coreClrDirectory[currentIndex - previousIndex] = '\0'; LoadCoreClrAtPath(coreClrDirectory, &libCoreClr); if (!libCoreClr) { previousIndex = currentIndex + 1; currentIndex = pathEnvironmentVariable.find(delimeter, previousIndex); } } } if (!libCoreClr) { throwV8Exception("Failed to find CoreCLR. Make sure that you have either specified the CoreCLR directory in the CORECLR_DIR environment variable or it exists somewhere in your PATH environment variable, which you do via the \"dnvm install\" and \"dnvm use\" commands."); return E_FAIL; } DBG("CoreClrEmbedding::Initialize - %s loaded successfully from %s", LIBCORECLR_NAME, &coreClrDirectory[0]); std::string assemblySearchDirectories; assemblySearchDirectories.append(¤tDirectory[0]); assemblySearchDirectories.append(":"); assemblySearchDirectories.append(&coreClrDirectory[0]); DBG("CoreClrEmbedding::Initialize - Assembly search path is %s", assemblySearchDirectories.c_str()); coreclr_initializeFunction initializeCoreCLR = (coreclr_initializeFunction) LoadSymbol(libCoreClr, "coreclr_initialize"); if (!initializeCoreCLR) { throwV8Exception("Error loading the coreclr_initialize function from %s: %s.", LIBCORECLR_NAME, GetLoadError()); return E_FAIL; } DBG("CoreClrEmbedding::Initialize - coreclr_initialize loaded successfully"); coreclr_create_delegateFunction createDelegate = (coreclr_create_delegateFunction) LoadSymbol(libCoreClr, "coreclr_create_delegate"); if (!createDelegate) { throwV8Exception("Error loading the coreclr_create_delegate function from %s: %s.", LIBCORECLR_NAME, GetLoadError()); return E_FAIL; } DBG("CoreClrEmbedding::Initialize - coreclr_create_delegate loaded successfully"); const char* propertyKeys[] = { "TRUSTED_PLATFORM_ASSEMBLIES", "APP_PATHS", "APP_NI_PATHS", "NATIVE_DLL_SEARCH_DIRECTORIES", "AppDomainCompatSwitch" }; std::string tpaList; AddToTpaList(coreClrDirectory, &tpaList); std::string appPaths(¤tDirectory[0]); #if EDGE_PLATFORM_WINDOWS appPaths.append(";"); #else appPaths.append(":"); #endif appPaths.append(edgeNodePath); DBG("CoreClrEmbedding::Initialize - Using %s as the app path value", appPaths.c_str()); const char* propertyValues[] = { tpaList.c_str(), appPaths.c_str(), appPaths.c_str(), assemblySearchDirectories.c_str(), "UseLatestBehaviorWhenTFMNotSpecified" }; DBG("CoreClrEmbedding::Initialize - Calling coreclr_initialize()"); result = initializeCoreCLR( bootstrapper, "Edge", sizeof(propertyKeys) / sizeof(propertyKeys[0]), &propertyKeys[0], &propertyValues[0], &hostHandle, &appDomainId); if (FAILED(result)) { throwV8Exception("Call to coreclr_initialize() failed with a return code of 0x%x.", result); return result; } DBG("CoreClrEmbedding::Initialize - CoreCLR initialized successfully"); DBG("CoreClrEmbedding::Initialize - App domain created successfully (app domain ID: %d)", appDomainId); SetCallV8FunctionDelegateFunction setCallV8Function; CREATE_DELEGATE("GetFunc", &getFunc); CREATE_DELEGATE("CallFunc", &callFunc); CREATE_DELEGATE("ContinueTask", &continueTask); CREATE_DELEGATE("FreeHandle", &freeHandle); CREATE_DELEGATE("FreeMarshalData", &freeMarshalData); CREATE_DELEGATE("SetCallV8FunctionDelegate", &setCallV8Function); CREATE_DELEGATE("CompileFunc", &compileFunc); CREATE_DELEGATE("Initialize", &initialize); DBG("CoreClrEmbedding::Initialize - Getting runtime info"); CoreClrGcHandle exception = NULL; BootstrapperContext context; context.runtimeDirectory = &coreClrDirectory[0]; context.applicationDirectory = getenv("EDGE_APP_ROOT"); context.edgeNodePath = &edgeNodePath[0]; if (!context.applicationDirectory) { context.applicationDirectory = ¤tDirectory[0]; } std::string operatingSystem = GetOSName(); std::string operatingSystemVersion = GetOSVersion(); context.architecture = GetOSArchitecture(); context.operatingSystem = operatingSystem.c_str(); context.operatingSystemVersion = operatingSystemVersion.c_str(); DBG("CoreClrEmbedding::Initialize - Operating system: %s", context.operatingSystem); DBG("CoreClrEmbedding::Initialize - Operating system version: %s", context.operatingSystemVersion); DBG("CoreClrEmbedding::Initialize - Architecture: %s", context.architecture); DBG("CoreClrEmbedding::Initialize - Runtime directory: %s", context.runtimeDirectory); DBG("CoreClrEmbedding::Initialize - Application directory: %s", context.applicationDirectory); DBG("CoreClrEmbedding::Initialize - Calling CLR Initialize() function"); initialize(&context, &exception); if (exception) { v8::Local<v8::Value> v8Exception = CoreClrFunc::MarshalCLRToV8(exception, V8TypeException); FreeMarshalData(exception, V8TypeException); throwV8Exception(v8Exception); } else { DBG("CoreClrEmbedding::Initialize - CLR Initialize() function called successfully") } exception = NULL; setCallV8Function(CoreClrNodejsFunc::Call, &exception); if (exception) { v8::Local<v8::Value> v8Exception = CoreClrFunc::MarshalCLRToV8(exception, V8TypeException); FreeMarshalData(exception, V8TypeException); throwV8Exception(v8Exception); } else { DBG("CoreClrEmbedding::Initialize - CallV8Function delegate set successfully"); } DBG("CoreClrEmbedding::Initialize - Completed"); return S_OK; }