现在的位置: 首页 > 综合 > 正文

WINDOWS API

2017年09月01日 ⁄ 综合 ⁄ 共 6769字 ⁄ 字号 评论关闭

IsWindow 检测是否是窗口句柄

IsWindowVisible检测窗口是否可见

GetLocalTime获取系统时间,年月日时分秒

ProcessIdToSessionId 利用进程号获取会话id

GetCurrentProcessId获取当前进程id

WTSGetActiveConsoleSessionId获取当前控制台会话id

WTSRegisterSessionNotification监控会话改变事件通知

RegisterServiceCtrlHandlerEx注册服务控制处理函数

OpenProcessToken打开一个进程的访问令牌access token

GetTokenInformation获取与accsee token令牌相关的信息

SetupDiGetClassDevs获取本地电脑上的设备或者接口集

SetupDiGetClassDevsEx获取本地电脑或者远程电脑上的设备或者接口集

SetupDiEnumDeviceInfo枚举设备集中的设备

SetupDiEnumDeviceInterfaces枚举设备接口集中的接口

SetupDiGetDeviceRegistryProperty获取设备的各种详细属性,需要与SetupDiGetClassDevs和SetupDiEnumDeviceInfo配合使用

SetupDiGetDeviceInterfaceDetail获取设备接口的详细信息,与SetupDiEnumDeviceInterfaces配合使用

SPDRP_DEVICEDESC

GetProcAddress从dll中获取某函数地址

MultiByteToWideChar单字节字符串转化为多字节字符串

setlocale(LC_ALL,"chs")当输出中文字符或者UNICODE字符乱码时调用

SetNamedPipeHandleState设置命名管道的读模式和阻塞模式

CommandLineToArgvW转换命令行参数,将字符串参数转换成argc argv格式

FileTimeToLocalFileTime 文件时间转换为本地文件时间(根据本地时区进行转换)

FileTimeToSystemTime文件时间(64位)转换为系统时间(时分秒)

CompareFileTime比较两个文件时间

GetLocalTime获取本地系统时间

GetProcessTimes获取进程的创建时间、退出时间、内核空间运行时间、用户空间运行时间(since midnight on January 1, 1601 at Greenwich, England)

CreateMutex(NULL, FALSE , TEXT("SmartMediaPlayerMutex"));创建命名互斥量,可同步不同的exe进程,必须用TEXT()

GetOpenFileName 创建一个OPEN对话框,就是常见的打开,选择一个文件那种

SHBrowseForFolder同GetOpenFileName(传说:在服务中执行该函数要设置BIF_USENEWUI,并且必须指定默认文件夹)

OpenInputDesktop打开输入桌面

GetUserObjectInformation获取指定窗口站或桌面的信息(如获取一个桌面的名称)

WinSta0_DesktopSwitch 这是一个系统命名事件,当发生桌面切换时置位,使用OpenEvent打开

SetThreadDesktop将调用线程附加到指定桌面,使该线程后面的操作都具有该桌面的权限

GetUserName获取当前线程所在用户

CreateProcessAsUser创建某特定用户的进程,此类函数还有CreateProcessWithLogon,CreateProcessWithToken

LoadUserProfile加载用户属性,特别是在服务中需要访问某用户空间(如注册表等)

LogonUser获取某用户的令牌

CreateEnvironmentBlock获取某用户空间的所有环境变量

EnumProcess枚举系统中所有进程ID(若要枚举所有进程,需要一定的权限,如SE_DEBUG_NAME)

EnumProcessModules枚举进程加载的所有模块,无需closehandle

GetModuleFileNameExW获取进程路径

GetModuleHandle通过模块名获取该模块句柄,该模块必须是本进程已经加载的

LookupPrivilegeValue查询权限对应的LUID,配合OpenProcessToken,AdjustTokenPrivileges使用可提升一个进程的权限

AdjustTokenPrivileges设置权限

SetWindowsHook设置窗口钩子,可过滤窗口消息

/**********************************************************************************************/

写入.ini文件:

BOOL WritePrivateProfileString(
  LPCTSTR lpAppName,  // INI文件中的一个字段名[节名]可以有很多个节名

  LPCTSTR lpKeyName,  // lpAppName 下的一个键名,也就是里面具体的变量名

  LPCTSTR lpString,   // 键值,也就是数据

  LPCTSTR lpFileName  // INI文件的路径
);

 读取.ini文件:

DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,        // INI文件中的一个字段名[节名]可以有很多个节名

  LPCTSTR lpKeyName,        // lpAppName 下的一个键名,也就是里面具体的变量名

  LPCTSTR lpDefault,        // 如果lpReturnedString为空,则把个变量赋给lpReturnedString

  LPTSTR lpReturnedString,  // 存放键值的指针变量,用于接收INI文件中键值(数据)的接收缓冲区

  DWORD nSize,            // lpReturnedString的缓冲区大小

  LPCTSTR lpFileName        // INI文件的路径
);

 读取整形值:(返回值为读到的整)

UINT GetPrivateProfileInt(
  LPCTSTR lpAppName,  // INI文件中的一个字段名[节名]可以有很多个节名
  LPCTSTR lpKeyName,  // lpAppName 下的一个键名,也就是里面具体的变量名
  INT nDefault,       // 如果没有找到指定的数据返回,则把个变量值赋给返回值

  LPCTSTR lpFileName  // INI文件的路径

);

 

/********************************************************************************************/

获取一个进程所在的会话id

OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);
GetTokenInformation(hToken, TokenSessionId, &dwId, sizeof(DWORD), &dwLen);

/*******************************************************/

驱动级获取进程id

pid = PsGetCurrentProcessId(); 
eprocess = PsGetCurrentProcess();
pid = eprocess->UniqueProcessId;

PsGetCurrentProcess返回的是进程结构体,结构体名称是EPROCESS,但这个结构体没有公开,你可以用WINDBG查查这个结构体的
//下面是WINDBG显示的XPSP3 EPROCESS的一部分
kd> dt nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x06c ProcessLock      : _EX_PUSH_LOCK
   +0x070 CreateTime       : _LARGE_INTEGER
   +0x078 ExitTime         : _LARGE_INTEGER
   +0x080 RundownProtect   : _EX_RUNDOWN_REF
   +0x084 UniqueProcessId  : Ptr32 Void
   +0x088 ActiveProcessLinks : _LIST_ENTRY

由于没有公开,所以你可以自己定义,然后使用,也可以(ULONG)(PULONG*)((char*)eprocess + 0x84)(XPSP3偏移是0x84)去访问,但兼容性就有些问题了。
当前,XP以上呢,系统提供了一个函数PsGetProcessId,可以从eprocess获取PID的,PsGetProcessId(eprocess)就是进程ID.
一般你用第一种方法PsGetCurrentProcessId就行了
PsGetCurrentProcessId和PsGetProcessId返回的是HANDLE值,但这个值就是PID,如果你不习惯,你可以强制转换为ULONG, ULONG CurrentProcessId = (ULONG)PsGetCurrentProcessId();
至于不起作用,那你查查其他方面的问题。

/*******************************************************/

IoGetDevicePropertyData  驱动层    通过该函数可以获取某物理设备的会话访问属性等;
IoSetDevicePropertyData  驱动层    通过该函数可以设置某物理设备仅被某个会话访问,其他会话不能访问;

SetupDiGetDeviceProperty 应用层    通过该函数可以获取某物理设备的会话访问属性;
SetupDiSetDeviceProperty 应用层    通过该函数可以设置某物理设备仅被某个会话访问,其他会话不能访问;

IoRegisterContainerNotification 驱动层   通过该函数在驱动中注册会话事件通知回调函数,可对会话事件进行响应;
WTSRegisterSessionNotification  应用层   功能与IoRegisterContainerNotification 类似。

 

GetModuleHandle  获取模块句柄,必须是已加载模块

GetCommandLine 获取本进程的启动命令行参数

GetEnvironmentString 获取环境变量

Debug_break 暂停程序执行,打开调试器,进入调试模式(一般用于dll开发)

GetSystemDirectory 获取系统目录路径

GetWindowsDirectory 获取Windows安装目录路径

_wgetcwd 获取当前程序的执行路径

GetFullPathName 获取完整路径及目标文件名

GetLocalTime 获取【年-月-日-时-分-秒】格式系统时间

OutputDebugString 打印调试信息,可用DebugView接收

GetExitCodeThread 获取线程退出码

EnumProcess 枚举进程

EnumProcessModules 枚举进程加载的模块

GetModuleFileNameEx 获取模块的对应的文件路径

GetModuleBaseName 返回模块名不包含路径

GetModuleInformation获取模块信息,包括模块加载地址,模块大小,模块的入口地址(main或者dllmain)

 /************************************窗口操作******************************************/

FindWindow 通过窗口类名或窗口名寻找顶层窗口(不能用来寻找子窗口)

EnumThreadWindows 枚举某线程所有的窗口,执行所设置的回调函数

EnumChildWindows 枚举某窗口的所有子窗口,执行所设置的回调函数

EnumWindows 枚举所有的顶层窗口,执行所设置的回调函数

InternalGetWindowText 获取窗口标题,直接从窗口结构体中获取

GetWindowText 获取窗口标题,通过给指定窗口发送WM_GETTEXT消息获取

SetParent 设置父窗口

GetParent 获取父窗口

ShowWindow 显示窗口(可设置显示方式)

GetForegroundWindow 获取前景窗口句柄

GetWindowThreadProcessId 获取创建指定窗口的线程和进程id

SetWindowsHookEx 设置窗口消息钩子

GetClientRect 获取窗口的客户区

SetWindowLong, SetWindowPtr 设置窗口属性

GetWindowRect 获取窗口矩形大小

SetWindowPos 设置窗口位置

MoveWindow 改变窗口位置和大小

GetNextWindow 获取下一个相关窗口(Z序中,子窗口中等)

GetWindow 返回与指定窗口有特定关系的窗口句柄

BringWindowToTop 把某窗口拉到Z序中同类窗口的顶部

IsWindowViSible 检测窗口是否可见

IsChild 检测窗口是否是子窗口

ClientRectToScreenRect 客户区坐标转换为屏幕坐标

ClientToScreen 客户点坐标转换为屏幕点坐标

InterSectRect 计算两个矩形区的交集(屏幕坐标)

/************************************其它API********************************************/

freopen 替换一个流,或者说重新分配文件指针,实现重定向。如果stream流已经打开,则先关闭该流。如果该流已经定向,则freopen将会清除该定向。此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错。

fflush 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件

 

strcpy() sprintf() strcat() 存在安全隐患, 其对应的安全版为:
strncpy() snprintf() strncat()
 
snprintf(s, 100, %.*S, 3, "abcd");
s的值为abc
%.*s 表示有两项, 第一项指定了长度,第二项则是%s的内容,所以取前三位
 
tolower 把字符转换成小写字母,非字母字符不做出处理
towlower Unicoe版
toupper 将字符转换为大写英文字母,非字母字符不做出处理
towupper Unicoe版
正则表达式输入
char group[64]={0}, id[64]={0}, arg[64]={0};
int rc, offset;
char *str = "drive..$id.file=/path/to/image\n";
rc = sscanf(str, "%63[^.]..%63[^.].%63[^=]%n", group, id, arg, &offset);
 /*******************************检测指针的有效性************************************************/
IsBadWritePtr
IsBadReadPtr
IsBadCodePtr
IsBadStringPtr
/***************************************************************************************/

 虚拟桌面系统的主要目标是为各种终端用户提供远程桌面访问支持。通过该系统的支撑,用户能够在远程服务器的虚拟机中运行操作系统桌面程序,同时在本地客户端呈现桌面,进行桌面体验。通过将用户本地的鼠标、键盘等输入设备映射到远程虚拟机中提供用户与虚拟桌面的交互能力。通过优化的图像和音视频压缩传输技术,可以在客户端为用户提供完美的高清音视频体验(对网络带宽有一定的要求)。通过桌面虚拟机的热迁移和负载均衡能力,为用户提供高可用的虚拟桌面支持。

【上篇】
【下篇】

抱歉!评论已关闭.