dword

WaitForMultipleObjects 是Windows中的一个功能非常强大的函数

柔情痞子 提交于 2019-12-27 02:26:52
WaitForMultipleObjects是Windows中的一个功能非常强大的函数,几乎可以等待Windows中的所有的内核对象 函数原型为: DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in the handle array CONST HANDLE *lpHandles, // pointer to the object-handle array BOOL fWaitAll, // wait flag DWORD dwMilliseconds // time-out interval in milliseconds ); 参数解析: DWORD 就是 Double Word, 每个word为2个字节的长度,DWORD双字即为4个字节,每个字节是8位。 nCount 指定列表中的句柄数量 最大值为MAXIMUM_WAIT_OBJECTS(64) *lpHandles 句柄数组的指针。lpHandles为指定对象句柄组合中的第一个元素 HANDLE类型可以为(Event,Mutex,Process,Thread,Semaphore)数组 bWaitAll 等待的类型,如果为TRUE,表示除非对象都发出信号,否则就一直等待下去;如果FALSE,表示任何对象发出信号即可

Win32串口API

筅森魡賤 提交于 2019-12-26 20:34:38
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。 无论那种操作方式,一般都通过四个步骤来完成: 打开串口 配置串口 读写串口 关闭串口 (1) 打开串口 Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: HANDLE CreateFile( LPCTSTR

截获 Windows socket API

女生的网名这么多〃 提交于 2019-12-26 15:45:39
1、前言 本文主要介绍了如何实现替换Windows上的API函数,实现 Windows API Hook (当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如 屏幕取词 , 个人防火墙 等。 这种 API Hook技术 并不是很新,但是涉及的领域比较宽广,要想做好有一定的技术难度。本文是采集了不少达人的以前资料并结合自己的实验得出的心得体会,在这里进行总结发表,希望能够给广大的读者提供参考,达到抛砖引玉的结果。 2、问题 最近和同学讨论如何构建一个Windows上的简单的个人防火墙。后来讨论涉及到了如何让 进程 关联 套接字端口 ,替换windows API,屏幕取词等技术。 其中主要的问题有: 1) 采用何种机制来截获 socket 的调用? 一般来说, 实现截获socket的方法有很多很多,最基本的,可以写 驱动 , 驱动 也有很多种, TDI驱动, NDIS驱动,Mini port驱动 …。由于我使用的是Win2000系统,所以截获socket也可以用Windows SPI来进行。另外一种就是 Windows API Hook 技术。 由于我没什么硬件基础,不会写驱动 ,所以第一种方法没有考虑,而用SPI相对比较简单。但是后来觉得Windows API Hook适应面更广,而且觉得自己动手能学到不少东西,就决定用

Windows 管道的原理剖析

寵の児 提交于 2019-12-26 14:41:33
文章目录 Windows 管道的原理剖析 1. 管道的使用 1.1 服务端 1.2 客户端 2. 实现 2.1 调用堆栈 2.2 驱动实现 2.3 CreateNamedPipeA原理 2.4 客户端CreateFile的原理 3. 总结 3.1 多实例 3.2 客户端和服务端 Windows 管道的原理剖析 今天有朋友问我,管道是否可以支持多个连接?其实是可以的,但是和socket使用起来有点不同,下面是msdn中管道服务端的例子: # include <windows.h> # include <stdio.h> # include <tchar.h> # include <strsafe.h> # define BUFSIZE 512 DWORD WINAPI InstanceThread ( LPVOID ) ; VOID GetAnswerToRequest ( LPTSTR , LPTSTR , LPDWORD ) ; int _tmain ( VOID ) { BOOL fConnected = FALSE ; DWORD dwThreadId = 0 ; HANDLE hPipe = INVALID_HANDLE_VALUE , hThread = NULL ; LPTSTR lpszPipename = TEXT ( "\\\\.\\pipe\

PE文件结构

こ雲淡風輕ζ 提交于 2019-12-26 11:22:36
PE,即移植的执行体。在Windows平台下,所有的可执行文件(包括EXE文件、DLL文件、SYS文件、COM文件)均使用PE文件结构。使用PE文件结构的可执行文件也成为PE文件。Windows系统下的可执行文件中包含着各种数据,包括代码、数据、资源等。虽然windows系统下的可执行文件包含如此众多的类型数据,但其存放都是有序的、结构化的、完全依赖于PE文件结构对各种数据的管理。 1.MZ头部是真正的DOS头部,其开始的两个字节为"MZ",该部分用于程序在DOS系统下的加载,它的结构被定义为IMAGE_DOS_HEADER,DOS头是为了该可执行程序可以兼容DOS系统。通常情况下,Win32的PE程序不能在DOS下运行,因此保留了这样一个简单的DOS程序用于提醒:不能运行于DOS程序下。 (1)struct IMAGE_DOS_HEADER{ WORD e_magic //这两个字节保存"MZ" ........... ........... //中间的成员不常用省略 LONG e_lfanew //这是最后一个成员 保存PE头部的位置 2.PE头保存着Windows系统加载可执行文件的重要信息。PE头部有IMAGE_NT_HEADERS(包含PE标识符,文件头IMAGE_FILE_HEADER、可选头IMAGE_OPTIONAL_HEADER。)定义

JMETER java.net.SocketException: Connection reset 报错解决方案

偶尔善良 提交于 2019-12-24 11:38:56
相关值解析 MaxUserPort:最大动态端口数(Default = 5000, Max = 65534) TcpTimedWaitDelay:TCP等待延迟时间(30) TcpNumConnections:TCP最大连接数(Default = 16,777,214) MaxFreeTcbs:最大TCP控制块(1000-2000) MaxHashTableSize:最大TCB Hash table数量(64-65536) 解析中值为10进制,下方脚本已全转换为16进制 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\] "MaxUserPort"=dword:fffe "TcpTimedWaitDelay"=dword:1e "TcpNumConnections"=dword:fffffe "MaxFreeTcbs"=dword:7D0 "MaxHashTableSize"=dword:10000 --------------------- 作者:weixin_40195027 来源:CSDN 原文:https://blog.csdn.net/weixin_40195027/article/details

【南京邮电】maze 迷宫解法

偶尔善良 提交于 2019-12-21 21:16:51
【南京邮电】maze 迷宫解法 题目来源:南京邮电大学网络攻防训练平台. 题目下载地址: https://pan.baidu.com/s/1i5gLzIt (密码rijss) 0x0 初步分析 题目中给出的执行文件是64位ELF可执行文件,可在64 位 Ubuntu下运行。这是一道简单的迷宫类型题目,通过静态分析即可获得flag。 在main函数中,能发现一段字符串 ******* * **** * **** * *** *# *** *** *** ********* 为了方便阅读: 空格替换为'.' 二维重排列(8x8) ..****** *...*..* ***.*.** **..*.** *..*#..* **.***.* **.....* ******** 通过该地图,可以预判: '#' 为目标坐标 左上角为(0,0) '*' 为边界,空格(点)为通路 手动画出通往目标的线 这道题目的意思很清晰,假设有一个小人站在初始坐标上,我们要控制小人走到‘#’所在的坐标。 需要通过逆向分析得出: 小人的初始坐标 指令的对应关系(上下左右) 0x1 逆向分析 以下分析结果基于IDA的伪代码 、IDA流程图、IDA反汇编结果等。 标准输入 scanf("%s", &s1, 0LL); 格式验证 if ( strlen(&s1) != 24 || (v3 = "nctf{",

实现:获取文件属性

跟風遠走 提交于 2019-12-21 03:40:25
代码如下: #include<stdio.h> #include<Windows.h> /* WIN32_FILE_ATTRIBUTE_DATA 文件属性的结构体 GetFileAttributesEx 这个是GetFileAttributes的加强版哇 */ DWORD ShowFileSize(DWORD nFileSizeHigh, DWORD nFileSizeLow) { //32位相当于4G,如果小的话都会再nFileSizeLow ,也没必要来左移nFileSizeHigh ULONGLONG FileSize;//64位无符号的整数来存储文件大小,因为 DWORD nFileSizeHigh DWORD nFileSizeLow printf("%d----%d", nFileSizeHigh, nFileSizeLow); FileSize = nFileSizeHigh; FileSize <<= 32; FileSize += nFileSizeLow; printf("文件大小为:%I64d\n",FileSize); return 0; } DWORD ShowFileAttribute(DWORD dwFileAttributes) { printf("文件信息\t"); if (dwFileAttributes & FILE_ATTRIBUTE

描述编译和链接过程

谁都会走 提交于 2019-12-20 18:04:09
原文摘自: http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html [yc]详解link 详解link 有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual Studio,Elicpse,Dev C++等),你可能不会发现程序是如何组织起来的(很多人因此而反对初学者使用IDE)。因为使用IDE,你所做的事情,就是在一个项目里新建一系列的.cpp和.h文件,编写好之后在菜单里点击“编译”,就万事大吉了。但其实以前,程序员写程序不是这样的。他们首先要打开一个编辑器,像编写文本文件一样的写好代码,然后在命令行下敲 cc 1.cpp -o 1.o cc 2.cpp -o 2.o cc 3.cpp -o 3.o 这里cc代表某个C/C++编译器,后面紧跟着要编译的cpp文件,并且以-o指定要输出的文件(请原谅我没有使用任何一个流行编译器作为例子)。这样当前目录下就会出现: 1.o 2.o 3.o 最后

c++ - length of array inside class function [duplicate]

▼魔方 西西 提交于 2019-12-20 06:03:26
问题 This question already has answers here : When a function has a specific-size array parameter, why is it replaced with a pointer? (3 answers) Closed 6 years ago . i know there are several threads asking a similar question but i couldn't find a solution and i'm somewhat new to c++. I want to calculate the length of a DWORD array. So it's just an unsigned long. DWORD offsets[] = {0x378, 0x14, 0x0}; This is my header definition of the func: DWORD allocateAddress(DWORD, DWORD[]); This is inside