反汇编windows htonl()函数
因为自己在系统内核写网络程序有时候需要调用htons htonl 这样的函数进行转换,但由于内核只能调用c运行库,别的API不能调用。自己也接触过一点汇编,从来没有去学过。看过老码识途这本书前几章,如是自己反编译试了一下,结果自己还真反出来,对于懂汇编的人确实非常容易。
- ULONG myHtonl(ULONG i)
- {
- ULONG eax,edx,ecx;
- eax = i;
- edx = i;
- edx = edx << 16;
- eax = eax & 0x0ff00;
- eax = eax | edx;
- edx = i;
- edx = edx & 0x0ff0000;
- ecx = i >> 16;
- edx = edx | ecx;
- eax = eax << 8;
- edx = edx >> 8;
- eax = eax | edx;
- return eax;
- }
变量就用寄存器的名字,这样避免混淆。 自己感觉这个代码是不是有点问题,他怎么没有判断自己系统是不是小端就进行转换了,如果自己电脑是高端怎么办呢?
后面看了网上一个人写模拟代码。
http://wxxweb.blog.163.com/blog/static/13512690020103145256909/
- ypedef unsigned short int uint16;
- typedef unsigned long int uint32;
- // 短整型大小端互换
- #define BigLittleSwap16(A) ((((uint16)(A) & 0xff00) >> 8) | \
- (((uint16)(A) & 0x00ff) << 8))
- // 长整型大小端互换
- #define BigLittleSwap32(A) ((((uint32)(A) & 0xff000000) >> 24) | \
- (((uint32)(A) & 0x00ff0000) >> 8) | \
- (((uint32)(A) & 0x0000ff00) << 8) | \
- (((uint32)(A) & 0x000000ff) << 24))
- // 本机大端返回1,小端返回0
- int checkCPUendian()
- {
- union{
- unsigned long int i;
- unsigned char s[4];
- }c;
- c.i = 0x12345678;
- return (0x12 == c.s[0]);
- }
- // 模拟htonl函数,本机字节序转网络字节序
- unsigned long int HtoNl(unsigned long int h)
- {
- // 若本机为大端,与网络字节序同,直接返回
- // 若本机为小端,转换成大端再返回
- return checkCPUendian() ? h : BigLittleSwap32(h);
- }
- // 模拟ntohl函数,网络字节序转本机字节序
- unsigned long int NtoHl(unsigned long int n)
- {
- // 若本机为大端,与网络字节序同,直接返回
- // 若本机为小端,网络数据转换成小端再返回
- return checkCPUendian() ? n : BigLittleSwap32(n);
- }
- // 模拟htons函数,本机字节序转网络字节序
- unsigned short int HtoNs(unsigned short int h)
- {
- // 若本机为大端,与网络字节序同,直接返回
- // 若本机为小端,转换成大端再返回
- return checkCPUendian() ? h : BigLittleSwap16(h);
- }
- // 模拟ntohs函数,网络字节序转本机字节序
- unsigned short int NtoHs(unsigned short int n)
- {
- // 若本机为大端,与网络字节序同,直接返回
- // 若本机为小端,网络数据转换成小端再返回
- return checkCPUendian() ? n : BigLittleSwap16(n);
- }
看了他自己添加了判断,我估计windows系统估计通过宏进行替换了honts 这些函数,如果是小端 定义转换内容,如是高端高端就定义直接返回即可了。这种做法windows最喜欢这样写代码了。
反汇编windows htonl()函数的更多相关文章
- 详解C语言的htons和htonl函数、大尾端、小尾端
在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 int main(){ printf(" ...
- windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- 用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)
文件拷贝程序 程序类型:Console 参数:源文件名 目的文件名 要求:1.只能使用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle ...
- htons和htonl函数具体应用
htons和htonl函数具体应用 htons和htonl函数,是用来将主机字节顺序转换为网络字节顺序在进行网络抓包时,抓到的包的数据是网络字节顺序,在进行编程时,要进行主机字节顺序和网络字节顺序间的 ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- MFC中调用Windows API函数的方式
windows aoi 函数的调用前面加::
- VBS调用Windows API函数
Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog » 程序设计 » VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...
随机推荐
- iso定制封装
http://xiaoli110.blog.51cto.com/1724/1617541
- TCP/IP 相关总结
1. 三次握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等 ...
- [iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)
A.需求 1.类似于微博内容的展示 2.头像 3.名字 4.会员标志 5.内容 6.分割线 7.配图(可选,可有可无) code source: https://github.com/hellov ...
- yii2 i18n学习
举例说明常见的翻译:Yii::t('app','Login'):追踪源码:BaseYii.php 文件 ,Yii::t($category, $message, $params = [], $lang ...
- 关于AS3里的Matrix3D中的appendXXX和prependXXX
最近在看3D相关的一些基础,因为搞as3这么多年了,决定3D基础这块还是从AS3入手,3D游戏开发这块从U3D入手,扯远了,研究Matrix3D类时发现了矩阵处理转换时的一些方法均分为appendXX ...
- SQLite使用教程11 表达式
SQLite 表达式 表达式是一个或多个值.运算符和计算值的SQL函数的组合. SQL 表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. 语法 假设 SELECT 语句的基本 ...
- action 带参数跳转
都容易忘记 <result name="goOpPolicy" type="redirect">queryPolicy.action?aaaa=${ ...
- 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...
- 产生不重复的随机数TGUID
uses ActiveX; procedure TForm1.BtnNewClick(Sender: TObject);var ID: TGUID; S: string;begin if CoC ...
- Twenty Newsgroups Classification任务之二seq2sparse(3)
接上篇,如果想对上篇的问题进行测试其实可以简单的编写下面的代码: package mahout.fansy.test.bayes.write; import java.io.IOException; ...