通过GetVersionEx和ntoskrnl.exe获取操作系统版本号

2023-11-04

#include <stdio.h>
#include <tchar.h>
#include <Shlobj.h>
#include <string>
#include <vector>
#pragma comment(lib, "Shell32.lib")
#pragma comment(lib, "Version.lib")

#ifdef UNICODE
typedef std::wstring	tstring;
#else
typedef std::string		tstring;
#endif // UNICODE

typedef struct __tagLANGANDCODEPAGE
{
	WORD   wLanguage;
	WORD   wCodePage;
}LANGANDCODEPAGE;
typedef LANGANDCODEPAGE*		PLANGANDCODEPAGE;
#define VERSION_UNKNOWN			TEXT("Unknown")
#define VERSION_UNCORRECT		TEXT("Uncorrect")

//校验 是否处于 WOW64模式下 
//如果 是 WOW64 即 32位应用程序运行在 64位操作系统下,这时如果要获取 system32真实路径需要关闭 操作系统文件重定向功能
//微软 提供两种 WOW64模式检测机制

//IsWow64Process 方式
BOOL IsWow64WithIsWow64Process(PBOOL bIsWow64)
{
	*bIsWow64 = FALSE;
	HMODULE hKernel32 = NULL;
	BOOL bRes = FALSE;

	//IsWow64Process 最小支持的操作系统为 Windows XP with SP2 
	//所以需要作出兼容性处理
	typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
	do 
	{
		//1.获取kernel32句柄
		hKernel32 = ::LoadLibrary(TEXT("Kernel32.dll"));
		if ( NULL == hKernel32 )
		{
			::OutputDebugStringA("--> IsWow64WithIsWow64Process Error 1");
			break;
		}

		//2.获取 IsWow64Process 函数地址
		LPFN_ISWOW64PROCESS lpIsWow64Process = (LPFN_ISWOW64PROCESS)::GetProcAddress(hKernel32, "IsWow64Process");
		if ( NULL == lpIsWow64Process )
		{
			::OutputDebugStringA("--> IsWow64WithIsWow64Process Error 2");
			break;
		}

		//3.调用 IsWow64Process
		bRes = lpIsWow64Process(::GetCurrentProcess(), bIsWow64);
		
	} while (FALSE);
	
	if (NULL != hKernel32)
	{
		::FreeLibrary(hKernel32);
		hKernel32 = NULL;
	}

	return bRes;
}

//GetNativeSystemInfo 方式
BOOL IsWow64WithGetNativeSystemInfo(PBOOL bIsWow64)
{
	*bIsWow64 = FALSE;
	HMODULE hKernel32 = NULL;
	SYSTEM_INFO sysInfo = { 0 };
	SYSTEM_INFO sysNativeInfo = { 0 };
	BOOL bRes = FALSE;

	//GetSystemInfo 最小要求系统为 Windows 2000 Professional 
	//GetNativeSystemInfo 最小要求系统为 Windows XP 
	//所以不需要作出任何兼容性处理,直接使用两个函数
	typedef void (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO);

	do 
	{
		//1.调用 GetSystemInfo
		::GetSystemInfo(&sysInfo);

		//2.调用 GetNativeSystemInfo获取kernel32句柄
		hKernel32 = ::LoadLibrary(TEXT("Kernel32.dll"));
		if ( NULL == hKernel32 )
		{
			::OutputDebugStringA("--> IsWow64WithGetNativeSystemInfo Error 1");
			break;
		}
		
		LPFN_GetNativeSystemInfo lpGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)::GetProcAddress(hKernel32, "GetNativeSystemInfo");
		if ( NULL == lpGetNativeSystemInfo )
		{
			::OutputDebugStringA("--> IsWow64WithGetNativeSystemInfo Error 2");
			break;
		}
		lpGetNativeSystemInfo(&sysNativeInfo);

		//3.分析
		/*
		根据MSDN的解释:SYSTEM_INFO 中的 wProcessorArchitecture 成员 此值为0时是 IA32,为9 时 是 AMD64
		如果32位程序 在 win32系统中 运行,则两个值都是 0,如果在win64 系统运行,则是GetSystemInfo 返回0, 
		GetNativeSystemInfo 返回9,简而言之 当着两个值不同时就认为程序在 win64系统上运行.
		*/
		if ( sysInfo.wProcessorArchitecture != sysNativeInfo.wProcessorArchitecture)
		{
			::OutputDebugStringA("IsWow64WithGetNativeSystemInfo --> WOW64!!");
			*bIsWow64 = TRUE;
		}
		else
		{
			::OutputDebugStringA("IsWow64WithGetNativeSystemInfo --> NOT WOW64!!");
			*bIsWow64 = FALSE;
		}

		bRes = TRUE;

	} while (FALSE);

	if (NULL != hKernel32)
	{
		::FreeLibrary(hKernel32);
		hKernel32 = NULL;
	}
	
	return bRes;
}

BOOL IsWow64(void)
{
	BOOL bIsWow64First = FALSE;
	BOOL bIsWow64Second = FALSE;
	BOOL bIsWow64 = FALSE;

	//1.先使用第一种方式
	BOOL bResFirst = IsWow64WithIsWow64Process(&bIsWow64First);

	//2.第二种方式
	BOOL bResSecond = IsWow64WithGetNativeSystemInfo(&bIsWow64Second);

	//3.校验
	if ( TRUE == bResFirst )
	{
		if ( bIsWow64First == bIsWow64Second )
		{
			::OutputDebugStringA("--> IsWow64 : The same results for the two time.");
			bIsWow64 = bIsWow64First;
		}
		else
		{//如果第一个函数执行成功,但是第一个函数返回的结果与第二个不一致时
         //以第二种方式检测为准
			::OutputDebugStringA("--> IsWow64 : The two execution results are not the same, using the results of the second.");
			bIsWow64 = bIsWow64Second;
		}
	}
	else
	{//如果第一个函数执行失败,直接使用第二种方式
		::OutputDebugStringA("--> IsWow64 : The first failure, using the results of the second.");
		bIsWow64 = bIsWow64Second;
	}

	return bIsWow64;
}


//文件重定向相关
BOOL TWow64EnableWow64FsRedirection(BOOLEAN bWow64FsEnableRedirection)
{
	BOOL bRes = FALSE;
	HMODULE hKernel32dll = NULL;
	do 
	{
		//1.获取 Kernel32.dll 模块句柄
		hKernel32dll = ::LoadLibraryA("Kernel32.dll");
		if ( NULL == hKernel32dll )
		{
			::OutputDebugStringA("--> GetWow64EnableWow64FsRedirectionAddr. Get [Kernel32.dll] error.");
			break;
		}

		//2.获取 Wow64EnableWow64FsRedirection 函数地址
		typedef BOOLEAN(WINAPI *pFunWow64EnableWow64FsRedirection)(BOOLEAN);
		pFunWow64EnableWow64FsRedirection	lpWow64EnableWow64FsRedirection = (pFunWow64EnableWow64FsRedirection)::GetProcAddress(hKernel32dll, "Wow64EnableWow64FsRedirection");
		if ( NULL == lpWow64EnableWow64FsRedirection )
		{
			::OutputDebugStringA("--> GetWow64EnableWow64FsRedirectionAddr. Get [Wow64EnableWow64FsRedirection] error.");
			break;
		}

		//3.执行
		bRes = lpWow64EnableWow64FsRedirection(bWow64FsEnableRedirection);
		if ( FALSE == bRes )
		{
			DWORD dwCode = ::GetLastError();
			char szLog[512] = { 0 };
			sprintf_s(szLog, 511, "--> TWow64EnableWow64FsRedirection Call API Error code = %u", dwCode);
			::OutputDebugStringA(szLog);
			break;
		}

		::OutputDebugStringA("--> TWow64EnableWow64FsRedirection End(ok)");

	} while (FALSE);

	if ( NULL != hKernel32dll )
	{
		::FreeLibrary(hKernel32dll);
		hKernel32dll = NULL;
	}

	return bRes;
}


//获取 system32 文件夹 路径("C:\windows\system32")
BOOL GetSystem32DirPath(LPTSTR lpFullPath, DWORD dwSize)
{
	TCHAR szBuf[MAX_PATH + 1] = { 0 };

	do 
	{
		//0.GetSystemDirectory
		if (0 != ::GetSystemDirectory(lpFullPath, dwSize))
		{
			::OutputDebugString(lpFullPath);

			return TRUE;
		}

		//1.使用 SHGetSpecialFolderPath  //C:\windows
		if (TRUE == ::SHGetSpecialFolderPath(NULL, szBuf, CSIDL_WINDOWS, FALSE))
		{
			::OutputDebugString(szBuf);
			break;
		}

		//2.如果失败使用GetWindowsDirectory //C:\windows
		if ( 0 != ::GetWindowsDirectory(szBuf, MAX_PATH) )
		{
			::OutputDebugString(szBuf);
			break;
		}

		//3.如果都失败 直接认为 c:\\windows
		::ZeroMemory(lpFullPath, (MAX_PATH+1)* sizeof(TCHAR));
		_tcscpy_s(szBuf, MAX_PATH, TEXT("C:\\windows"));

	} while (FALSE);

	DWORD dwBufSize = _tcslen(szBuf);
	if ( (NULL == lpFullPath) || ( dwSize < dwBufSize) )
	{
		TCHAR szLog[512] = { 0 };
		_stprintf_s(szLog, 511, TEXT("GetSystem32DirPath Failed. Size=%d, OurSize=%d"), dwSize, dwBufSize);
		::OutputDebugString(szLog);

		return FALSE;
	}

	_stprintf_s(lpFullPath, dwSize - 1, TEXT("%s\\system32"), szBuf);
	::OutputDebugString(lpFullPath);

	return TRUE; 
}


//获取 ntoskrnl.exe 文件的 “产品版本号”
tstring GetNtosKrnlFileVersion(LPCTSTR lpFullPath)
{
	DWORD dwHandle = 0;
	DWORD dwFileInfoSize = ::GetFileVersionInfoSize(lpFullPath, &dwHandle);
	if (0 == dwFileInfoSize)
	{
		return tstring(TEXT(""));
	}

	std::vector<char> sResult(dwFileInfoSize /** sizeof(WCHAR)*/, 0x00);
	if (FALSE == ::GetFileVersionInfo(lpFullPath, 0, dwFileInfoSize, &sResult.front()))
	{
		return tstring(TEXT(""));
	}

	PLANGANDCODEPAGE lpTranslationPtr = NULL;
	UINT uLen = 0;
	if (FALSE == ::VerQueryValue(&sResult.front(), TEXT("VarFileInfo\\Translation"), (LPVOID*)&lpTranslationPtr, &uLen))
	{
		return tstring(TEXT(""));
	}

	TCHAR szVersionValue[512] = TEXT("");
	_stprintf_s(szVersionValue, 511, TEXT("\\StringFileInfo\\%04x%04x\\ProductVersion"), lpTranslationPtr[0].wLanguage, lpTranslationPtr[0].wCodePage);

	LPTSTR lpInformationPtr = NULL;
	if (FALSE == ::VerQueryValue(&sResult.front(), szVersionValue, (LPVOID*)&lpInformationPtr, &uLen))
	{
		return tstring(TEXT(""));
	}

	if (_tcslen(lpInformationPtr) <= 0)
	{
		return tstring(TEXT(""));
	}

	return tstring(lpInformationPtr);
}


//根据 ntoskrnl产品版本号 获取 主版本号、次版本号、Build号
BOOL GetVersionInfos(tstring tstrVer, LPDWORD lpdwMajorVersion, LPDWORD lpdwMinorVersion, LPDWORD lpdwBuildNumber)
{
	//1.主版本号
	int nMajorVersionIndex = tstrVer.find(TEXT("."));
	if ( tstring::npos == nMajorVersionIndex )
	{
		return FALSE;
	}

	tstring tstrMajorVersion = tstrVer.substr(0, nMajorVersionIndex);

	//2.次版本号
	tstrVer = tstrVer.substr(nMajorVersionIndex + 1);
	int nMinorVersionIndex = tstrVer.find(TEXT("."));
	if ( tstring::npos == nMinorVersionIndex )
	{
		return FALSE;
	}

	tstring tstrMinorVersion = tstrVer.substr(0, nMinorVersionIndex);

	//3.Build号
	tstrVer = tstrVer.substr(nMinorVersionIndex + 1);
	int nBuildIndex = tstrVer.find(TEXT("."));
	if ( tstring::npos == nBuildIndex )
	{
		return FALSE;
	}

	tstring tstrBuild = tstrVer.substr(0, nBuildIndex);

	//4.生成
	*lpdwMajorVersion = _ttoi(tstrMajorVersion.c_str());
	*lpdwMinorVersion = _ttoi(tstrMinorVersion.c_str());
	*lpdwBuildNumber = _ttoi(tstrBuild.c_str());

	return TRUE;
}


//获取 ntoskrnl.exe 文件的 “产品版本号”
BOOL GetNtosKrnlFileVersion(LPDWORD lpdwMajorVersion, LPDWORD lpdwMinorVersion, LPDWORD lpdwBuildNumber)
{
	BOOL bIsCloseWow64 = FALSE;
	BOOL bRes = FALSE;

	do 
	{
		//1.校验 WOW64模式
		//2.如果处于WOW64模式,禁用文件重定向
		if (TRUE == IsWow64())
		{
			if (FALSE == TWow64EnableWow64FsRedirection(FALSE))
			{
				break;
			}

			bIsCloseWow64 = TRUE;
		}

		//3.获取system32目录路径
		TCHAR szPath[MAX_PATH + 1] = { 0 };
		if (FALSE == GetSystem32DirPath(szPath, MAX_PATH) )
		{
			break;
		}

		tstring tstrNtosKrnl(szPath);
		tstrNtosKrnl += TEXT("\\ntoskrnl.exe");
		::OutputDebugString(tstrNtosKrnl.c_str());

		//4.获取ntoskrnl版本号
		tstring tstrResult = GetNtosKrnlFileVersion(tstrNtosKrnl.c_str());
		if ((tstring(VERSION_UNKNOWN) == tstrResult) || (tstring(VERSION_UNCORRECT) == tstrResult))
		{
			break;
		}

		//
		//5.读取 主版本号、次版本号、Build号
		if (FALSE == GetVersionInfos(tstrResult, lpdwMajorVersion, lpdwMinorVersion, lpdwBuildNumber))
		{
			break;
		}

		//6. 成功 设置标记位
		bRes = TRUE;

		//LOG
		TCHAR szLog[512] = { 0 };
		_stprintf_s(szLog, 511, TEXT("Version: %d.%d  Build : %d"), *lpdwMajorVersion, *lpdwMinorVersion, *lpdwBuildNumber);
		::OutputDebugString(szLog);
	} while (FALSE);

	if (TRUE == bIsCloseWow64)
	{
		TWow64EnableWow64FsRedirection(TRUE);
	}

	return  bRes;
}


// 获取 操作系统版本号
DWORD GetVersion(void)
{
	OSVERSIONINFO osInfo = { 0 };
	osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	if (FALSE == GetVersionEx(&osInfo))
	{
		return ::GetVersion();
	}
	
	DWORD dwMajorVersion = osInfo.dwMajorVersion & 0xFFFFFFFF;
	DWORD dwMinorVersion = (osInfo.dwMinorVersion & 0xFFFFFFFF) << 8;
	DWORD dwVerTemp = dwMajorVersion | dwMinorVersion;
	DWORD dwBuild = (osInfo.dwBuildNumber & 0xFFFFFFFF) << 16;
	
	return (dwBuild | dwVerTemp);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过GetVersionEx和ntoskrnl.exe获取操作系统版本号 的相关文章

  • JS 元素遍历

    1 循环遍历从getElementsByClassName返回的所有元素 var elements document getElementsByClassName classname Array prototype forEach call
  • Gh0st 远程管理系统新概念

    接触Gh0st有很长一段时间了 对于插件或是界面已然是轻车熟路 从下月开始将分章节系统性详细讲解架构模式 以及如何设计自己企业的远控管理软件
  • C++类上使用属性(__declspec property)

    原始代码如下 class A private int m nIndex public int getIndex return m nIndex void setIndex int value m nIndex value 如果采用属性方式实
  • C++之xlsx文件操作之写操作

    采用xlsxwriter开源库的实现 声明如下 include xlsxwriter include xmlwriter h include xlsxwriter include workbook h include xlsxwriter
  • VC++ 程序启动即隐藏

    所谓的隐藏是程序启动后不显示主窗体 网上介绍了很多方法 是否达到效果 众说纷纭 这里只介绍一种在项目中实际应用到的切实可行的方法 这里假设主窗体为CMainDialog 1 变量声明 BOOL m bShowWindow 2 给变量赋初始值
  • C++ 标准库中数据类型转换

    头文件引用
  • VC++ 设定Windows程序自启动(非管理员权限)

    Windows程序自启动方式有很多种 任务计划 注册表 启动项等等 创建任务计划和启动项 都需要程序具有管理员权限才能写入 在此略过 只介绍启动项方式 要实现启动项方式 必须要知道当前用户下启动项方式的目录 我们才好将程序或程序的快捷方式存
  • 微信网页版接口详解

    一 网页版微信提供的HTTP接口 1 获取uuid 说明 用于获取显示二维码以及登录所需的uuid 标识获取二维码和扫码的为同一个用户 请求方式 GET 地址 https login wx qq com jslogin get参数 参数 示
  • VC++ OpenCV4.x二维码识别

    自OpenCV4 x开始 二维码识别已经悄然进入 再也不用看zbar脸色了 以下是官网发布的源码 include opencv2 objdetect hpp include opencv2 imgproc hpp include openc
  • VC++ UI布局管理器

    程序从codeproject上下载的 功能类似QT的QLayout 有了它界面缩放再也不会乱套了 具体使用方法可参考源码示例 资源下载链接地址 https download csdn net download u012156872 1926
  • VC++ CSWDirectoryListCtrl磁盘文件列表

    效果图 头文件定义 CSWDirectoryListCtrl h pragma once include afxwin h include
  • Node.js EventEmitter事件

    Node js EventEmitter Node js 所有的异步 I O 操作在完成时都会发送一个事件到事件队列 Node js 里面的许多对象都会分发事件 一个 net Server 对象会在每次有新连接时触发一个事件 一个 fs r
  • vim/vi常用命令集

    格式 指令 或指令 参数 指令解释 文件操作 vim vi 打开一个空文件 vim vi a txt 打开当前目录中的a txt文件 若文件不存在则创建一个名为a txt的文件 指定保存位置为当前目录 vim vi home a txt 打
  • CStdioFile扩展(支持Ansi、Unicode、Utf-8等文本格式)

    头文件声明 CStdioFileEx h StdioFileEx h interface for the CStdioFileEx class Version 1 1 23 August 2003 Incorporated fixes fr
  • 主线程消息处理

    写程序过程中 往往会遇到在按钮时间中执行一个循环事件 for while 耗费比较长的时候 这个时候会造成界面的假死想象 对于经常写程序的人来说 解决起来相对比较容易 创建一个子线程 然后把事件放到子线程执行 但是对于初学者而言 创建子线程
  • CFileDialog 多文件选择注意事项

    当选择文件数量比较多的时候 发现CFileDialog返回文件名并不完整 翻阅MSDN发现文件名长度是有限制的 解决思路 CFileDialog dlgOpen TRUE T txt NULL OFN HIDEREADONLY OFN RE
  • VC++ FTP文件下传(断点续传)

    include
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include
  • C++ xml库的选择

    自从触及xml文件的读写 一直以来都是用的tinyxml2 接口简单 然而近期项目频繁出错 跟踪调试发现 问题出在了xml文件的读写上 当节点数超过百万级别的时候 内存暴增到G的当量 很显然程序会由于内存申请不足崩掉了 果断寻找替代品 百度
  • 粤嵌GEC6818开发板-入门感慨篇(续一)

    触摸屏的事件 include

随机推荐

  • 两条轨迹相似度算法,轨迹相似性度量

    百度地图 百度地图是百度提供的一项网络地图搜索服务 覆盖了国内近400个城市 数千个区县 在百度地图里 用户可以查询街道 商场 楼盘的地理位置 也可以找到离您最近的所有餐馆 学校 银行 公园等等 2010年8月26日 在使用百度地图服务时
  • VS2019环境下C++配置环境/创建动态链接库

    文章目录 前言 一 配置环境 0 准备 1 添加项目表 2 include文件与lib文件的配置 include文件设置 lib文件配置 二 使用已有代码生成动态链接库 前言 最近有一个收尾的项目分到了手里 由于基本没有使用过VS2019所
  • linux内核oops错误码说明,Linux Kernel Oops异常分析

    0 linux内核异常常用分析方法 异常地址是否在0附近 确认是否是空指针解引用问题 异常地址是否在iomem映射区 确认是否是设备访问总线异常问题 如PCI异常导致的地址访问异常 异常地址是否在stack附近 如果相邻 要考虑是否被踩 比
  • 验证尼科彻斯定理

    验证尼科彻斯定理 即 任何一个整数的立方都可以写成一串连续奇数的和 问题分析与算法设计 本题是一个定理 我们先来证明它是成立的 对于任一正整数a 不论a是奇数还是偶数 整数 a a a 1 必然为奇数 构造一个等差数列 数列的首项为 a a
  • SVN迁移至GIT,并附带历史提交记录

    文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展 GIT逐渐取代SVN成为主流的版本管理工具 部门的项目代码也决定迁移至git进行管理 所以就调研了一下具体的实现方案 要
  • linux创建git仓库

    1 安装 yum install y git 2 查看 Git 版本 git version 3 查看有没有git用户 id git 没有用户创建 useradd git 设置密码 passwd git 删除密码 passwd d f gi
  • Tomcat配置远程调试端口

    1 Linxu系统 bin startup sh开始处中增加如下内容 Java代码 declare x CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunjdwp tr
  • JVM系列-第10章-垃圾回收概述和相关算法

    文章目录 toc 垃圾回收概述 大厂面试题 蚂蚁金服 百度 天猫 滴滴 京东 阿里 字节跳动 什么是垃圾 为什么需要GC 早期垃圾回收 Java 垃圾回收机制 自动内存管理 应该关心哪些区域的回收 垃圾回收相关算法 标记阶段 引用计数算法
  • Python实现选择排序

    选择排序简介 选择排序 Selection sort 是一种简单直观的排序算法 简单来说就是从无序队列里面挑选最小的元素 和无序队列头部元素替换 放到有序队列中 最终全部元素形成一个有序的队列 选择排序原理 首先在未排序序列中找到最小 大
  • tomcat的启动流程及原理

    组件介绍 Tomcat 最重要的是两个组件是 Connector 连接器 和 Container 容器 集装箱 Connector 组件是可以被替换 这样可以提供给服务器设计者更多的选择 因为这个组件是如此重要 不仅跟服务器的设计的本身 而
  • 当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

    作者 涛姐涛哥 链接 cnblogs com taojietaoge p 11575376 html 如何更规范化编写Java 代码 Many of the happiest people are those who own the lea
  • CTFshow 信息收集 web18

    根据提示 不要着急 休息 休息一会儿 玩101分给你flag 打开是一个小游戏 要么玩到101分 要么直接作弊 查看源代码 发现js文件 里面发现有个score 0 只要它为101就应该能得到flag了吧 ctrl F搜索score在最底下
  • vue 报错error: 'ev' is defined but never used (no-unused-vars)

    我要做的是用vue在网页上显示一个button 报错信息 修改 没有在components中调用
  • MyBatis-plus 提示 Data truncation: Out of range value for column ‘id‘ at row 1

    记录一下MyBatis plus 提示的错误信息 Error updating database Cause com mysql cj jdbc exceptions MysqlDataTruncation Data truncation
  • Tcpdump命令详解

    目录 一 tcpdump作用 二 tcpdump命令选项和捕获主机到主机的数据包 2 1 命令选项 2 2 tcpdump表达式 关于数据类型的关键字 数据传输方向的关键字 协议关键字 其他关键字 2 3 tcpdump捕获方式 编辑 一
  • 概率论与数理统计 (二)计算题和应用题

    概率论一些知识 https blog csdn net zuoyonggang123 article details 79110916 utm medium distribute pc relevant none task blog OPE
  • 写函数,判断用户传入的参数(字符串、列表、元组)长度是否大于5

    def estimateLength data if len data gt 5 print 该参数长度大于5 else print 该参数长度不大于5 str xiao ran list 12 34 56 78 90 tuple 小灰灰
  • 【算法】高精度算法:加减乘除(全)

    看的视频在这里 题目 加法 减法 乘法 除法 高 低 加法 思想 用数组模拟高精度 算法核心 c i a i b i c i 1 c i 10 c i c i 10 注意 是c i a i b i 是累加 例题 求a b a b范围都 lt
  • 学前STEM课堂的3个入口

    在STEM活动开始前 教师要以观察性问题来吸引幼儿的注意力 引导幼儿关注 是什么 的问题 进而促使幼儿与教师开始对话和一起探索 格物斯坦小坦克带大家一起看看学前stem课堂的3个入口 是什么 的问题关注的是正发生于幼儿眼前的事情 即幼儿所注
  • 通过GetVersionEx和ntoskrnl.exe获取操作系统版本号

    include