在Windows下创建进程和线程的API

合集下载

createprocess 示例

createprocess 示例

标题:CreateProcess 示例1. 引言CreateProcess 是Windows操作系统中的一个API函数,它用于创建一个新的进程或者线程。

本文将通过一个示例来详细介绍CreateProcess函数的使用方法和注意事项。

2. 示例代码以下是一个使用CreateProcess函数创建新进程的示例代码:```c#include <windows.h>#include <tchar.h>int _tmain(int argc, TCHAR* argv[]){// 定义变量STARTUPINFO si;PROCESS_INFORMATION pi;// 初始化STARTUPINFO结构ZeroMemory(si, sizeof(si));si.cb = sizeof(si);ZeroMemory(pi, sizeof(pi));// 创建新进程if (!CreateProcess(NULL, // 指向可执行模块的名称_T("C:\\Windows\\system32\\calc.exe"), // 命令行参数 NULL, // 进程句柄不能被继承NULL, // 线程句柄不能被继承FALSE, // 设置句柄继承的方式0, // 创建标志NULL, // 环境变量NULL, // 指定默认工作目录si, // 指向STARTUPINFO结构pi)) // 指向PROCESS_INFORMATION结构{_tprintf(_T("CreateProcess failed (d).\n"), GetLastError()); return 1;}// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 关闭进程和线程的句柄CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}```3. 代码分析这段代码首先包含了头文件windows.h和tchar.h,然后定义了一个_tmain函数,该函数为程序的入口点。

createprocess和createprocessasuser

createprocess和createprocessasuser

createprocess和createprocessasuser
`CreateProcess`和`CreateProcessAsUser`都是Windows API中用于创建新进程的函数,但它们之间存在一些关键差异:
1. 用户上下文:`CreateProcessAsUser`允许你以其他用户的身份创建一个进程,而`CreateProcess`只能以当前用户的身份创建进程。

这意味着
`CreateProcessAsUser`可以用于跨用户会话创建进程。

2. 权限要求:为了使用`CreateProcessAsUser`,你需要有足够的权限来访问其他用户的会话。

相比之下,你只需要有足够的权限在当前用户会话中创建进程来使用`CreateProcess`。

因此,你应该根据具体需求选择使用哪个函数。

如果你需要在其他用户的会话中创建进程,并且有足够的权限,那么`CreateProcessAsUser`可能是更好的选择。

如果你只需要在当前用户的会话中创建进程,那么`CreateProcess`就足够了。

createprocess()的参数

createprocess()的参数

createprocess()的参数
createprocess()是一个Windows系统下的API函数,负责创建一个新进程。

该函数的参数如下:
1. lpApplicationName(应用程序名称):应用程序的可执行文件名称或者路径。

2. lpCommandLine(命令行):要传递给新进程的命令行参数。

3. lpProcessAttributes(进程安全属性):指定新进程的安全属性,可以为 NULL。

4. lpThreadAttributes(线程安全属性):指定新线程的安全属性,可以为 NULL。

5. bInheritHandles(是否继承):标识新进程是否继承父进程已经打开的句柄。

6. dwCreationFlags(创建标识):指定新进程的创建标志,例如 CREATE_NEW_CONSOLE 等。

7. lpEnvironment(环境变量):指定新进程的环境变量,可以为 NULL。

8. lpCurrentDirectory(当前目录):指定新进程的当前目录,可以为 NULL。

9. lpStartupInfo(启动信息):包含一个 STARTUPINFO 结构体,定义了新进程的一些启动信息。

10. lpProcessInformation(进程信息):包含一个PROCESS_INFORMATION 结构体,返回新进程的一些信息。

注意:以上每个参数都要按照其规定的数据类型传递值,否则可能出现运行时错误。

WindowsAPI函数大全(API之进程和线程函数)

WindowsAPI函数大全(API之进程和线程函数)

WindowsAPI函数大全(API之进程和线程函数)API之进程和线程函数CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接CreateEvent 创建一个事件对象CreateMailslot 创建一个邮路。

返回的句柄由邮路服务器使用(收件人)CreateMutex 创建一个互斥体(MUTEX)CreateNamedPipe 创建一个命名管道。

返回的句柄由管道的服务器端使用CreatePipe 创建一个匿名管道CreateProcess 创建一个新进程(比如执行一个程序)CreateSemaphore 创建一个新的信号机CreateWaitableTimer 创建一个可等待的计时器对象DisconnectNamedPipe 断开一个客户与一个命名管道的连接DuplicateHandle 在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄ExitProcess 中止一个进程FindCloseChangeNotification 关闭一个改动通知对象FindExecutable 查找与一个指定文件关联在一起的程序的文件名FindFirstChangeNotification 创建一个文件通知对象。

该对象用于监视文件系统发生的变化FindNextChangeNotification 重设一个文件改变通知对象,令其继续监视下一次变化FreeLibrary 释放指定的动态链接库GetCurrentProcess 获取当前进程的一个伪句柄GetCurrentProcessId 获取当前进程一个唯一的标识符GetCurrentThread 获取当前线程的一个伪句柄GetCurrentThreadId 获取当前线程一个唯一的线程标识符GetExitCodeProces 获取一个已中断进程的退出代码GetExitCodeThread 获取一个已中止线程的退出代码GetHandleInformation 获取与一个系统对象句柄有关的信息GetMailslotInfo 获取与一个邮路有关的信息GetModuleFileName 获取一个已装载模板的完整路径名称GetModuleHandle 获取一个应用程序或动态链接库的模块句柄GetPriorityClass 获取特定进程的优先级别GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况GetProcessTimes 获取与一个进程的经过时间有关的信息GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存GetSartupInfo 获取一个进程的启动信息GetThreadPriority 获取特定线程的优先级别GetTheardTimes 获取与一个线程的经过时间有关的信息GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符LoadLibrary 载入指定的动态链接库,并将它映射到当前进程使用的地址空间LoadLibraryEx 装载指定的动态链接库,并为当前进程把它映射到地址空间LoadModule 载入一个Windows应用程序,并在指定的环境中运行MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。

WindowsAPI函数大全(完整)

WindowsAPI函数大全(完整)

WindowsAPI函数⼤全(完整)Windows API函数⼤全,从事软件开发的朋友可以参考下1. API之⽹络函数WNetAddConnection 创建同⼀个⽹络资源的永久性连接WNetAddConnection2 创建同⼀个⽹络资源的连接WNetAddConnection3 创建同⼀个⽹络资源的连接WNetCancelConnection 结束⼀个⽹络连接WNetCancelConnection2 结束⼀个⽹络连接WNetCloseEnum 结束⼀次枚举操作WNetConnectionDialog 启动⼀个标准对话框,以便建⽴同⽹络资源的连接WNetDisconnectDialog 启动⼀个标准对话框,以便断开同⽹络资源的连接WNetEnumResource 枚举⽹络资源WNetGetConnection 获取本地或已连接的⼀个资源的⽹络名称WNetGetLastError 获取⽹络错误的扩展错误信息WNetGetUniversalName 获取⽹络中⼀个⽂件的远程名称以及/或者UNC(统⼀命名规范)名称WNetGetUser 获取⼀个⽹络资源⽤以连接的名字WNetOpenEnum 启动对⽹络资源进⾏枚举的过程2. API之消息函数BroadcastSystemMessage 将⼀条系统消息⼴播给系统中所有的顶级窗⼝GetMessagePos 取得消息队列中上⼀条消息处理完毕时的⿏标指针屏幕位置GetMessageTime 取得消息队列中上⼀条消息处理完毕时的时间PostMessage 将⼀条消息投递到指定窗⼝的消息队列PostThreadMessage 将⼀条消息投递给应⽤程序RegisterWindowMessage 获取分配给⼀个字串标识符的消息编号ReplyMessage 答复⼀个消息SendMessage 调⽤⼀个窗⼝的窗⼝函数,将⼀条消息发给那个窗⼝SendMessageCallback 将⼀条消息发给窗⼝SendMessageTimeout 向窗⼝发送⼀条消息SendNotifyMessage 向窗⼝发送⼀条消息3. API之⽂件处理函数CloseHandle 关闭⼀个内核对象。

【分享】Windows API 手册

【分享】Windows API 手册

【分享】W i n d o w sA P I手册work Information Technology Company.2020YEARWindows API 手册1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称WNetGetUser 获取一个网络资源用以连接的名字WNetOpenEnum 启动对网络资源进行枚举的过程2. API之消息函数BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列字串2PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口SendMessageTimeout 向窗口发送一条消息SendNotifyMessage 向窗口发送一条消息3. API之文件处理函数CloseHandle 关闭一个内核对象。

WindowsAPI函数大全(Windows编程参考手册)

WindowsAPI函数大全(Windows编程参考手册)

WindowsAPI函数大全(Windows编程参考手册)1、基础服务(Base Services):提供对Windows系统可用的基础资源的访问接口。

比如象:文件系统(file system)、外部设备(device)、,进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。

这些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文档中;以及32位Windows下的kernel32.dll和advapi32.dll中。

2、图形设备接口(GDI):提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。

它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。

3、图形化用户界面(GUI):提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。

接收鼠标和键盘输入,以及其他与GUI有关的功能。

这些调用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。

从Windows XP 版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。

4、通用对话框链接库(Common Dialog Box Library):为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等等。

这个链接库位于:16位Windows下的commdlg.dll 中,以及32位Windows下comdlg32.dll中。

它被归类为User Interface API之下。

5、通用控件链接库(Common Control Library):为应用程序提供接口来访问操作系统提供的一些高级控件。

比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。

c语言多线程的三种实现方式

c语言多线程的三种实现方式

c语言多线程的三种实现方式1 C语言多线程实现C语言语言既可以用于创建单线程应用程序,也可以用于创建多线程应用程序。

它的多线程实现有三种方式:POSIX线程库(Pthread),Windows API,以及共享内存。

1.1 POSIX线程库(Pthread)POSIX线程库(Pthread)是Linux系统的一种线程API,它由标准POSIX提供,以实现多线程程序设计。

它提供许多函数用于创建、销毁线程,设置线程属性,等待线程完成以及通信功能等。

Pthread在多线程编程中被使用广泛,它更易于操纵,可以让多线程编程更加容易和有趣。

1.2 Windows APIWindows API 也是可用于C语言多线程编程的方式之一。

Windows API提供许多功能:创建线程,挂起线程,等待线程结束,分离线程,设置线程优先级等等。

Windows API也提供了很多函数和常量用于控制线程。

它与POSIX线程库不同,Windows API不使用POSIX线程库,而使用Windows API实现多线程程序时,同一应用程序可以具有多个线程。

1.3 共享内存共享内存是指多个进程可以访问同一个内存区域,从而使它们能够共享数据,实现常见的多线程编程任务。

在C语言中,可以使用mmap()函数将共享内存映射成文件描述符,在一定范围内允许多个进程对共享内存的随机读写访问。

这是一种实现多线程的方式,能够极大地提高程序的效率。

以上就是C语言中多线程实现的三种方式。

POSIX线程库(Pthread)可以简易实现,更能让多线程编程更加容易和有趣;Windows API也可以实现多线程编程,可以让同一应用程序有多个线程;共享内存是一种实现多线程的方法,能够极大地提高程序的效率。

windows api 用法

windows api 用法

windows api 用法
Windows API是指Windows操作系统开发的接口,用于控制系统内的各种应用。

以下是Windows API的用法示例:
```vb
Private Declare Sub Sleep Lib "kernel32" (ByVal dw Milliseconds As Long) ```
上述代码中的关键字和参数含义如下:
- Private:声明在窗体的通用部分,表示这个窗体的任何地方都可以调用。

- Declare:表示要声明API。

- Sub:是一个过程,没有返回值。

- Sleep:是API的名称,相当于过程的名字,从字面上来看是“睡眠”的意思,在这里是让系统延时。

- dw Milliseconds:参数为毫秒,即暂停运行的时间,1秒=1000毫秒。

通过调用Windows API,开发人员可以在编程中实现更强大的功能和更复杂的操作,如果你想了解更多关于Windows API的用法,可以继续向我提问。

createprocess用法

createprocess用法

createprocess用法CreateProcess是一个Windows API函数,用于创建新的进程。

它可以接受多个参数,用于指定新进程的属性。

在Windows操作系统中,CreateProcess是非常常用的函数,它能够创建多种类型的进程,包括控制台应用、窗口应用以及服务应用等。

在本篇文章中,我们将详细介绍CreateProcess的用法。

首先,我们需要引入一个Windows API库文件<Windows.h>,头文件中包含了CreateProcess函数和其他相关内容。

在使用CreateProcess函数之前,需要定义一个PROCESS_INFORMATION结构体和一个STARTUPINFO结构体,以保存新进程的信息。

如下所示:```#include <Windows.h>int main(){PROCESS_INFORMATION pi;STARTUPINFO si;// 具体参数配置在后面讲解...}```接下来,我们需要使用CreateProcess函数来创建新的进程。

CreateProcess函数有很多参数,其中最重要的参数有以下四个:```BOOL CreateProcess(LPCSTR lpApplicationName, // 可执行文件路径或名称LPSTR lpCommandLine, // 命令行参数LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags, // 进程创建标识符LPVOID lpEnvironment,LPCSTR lpCurrentDirectory,LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation);```第一个参数lpApplicationName是指要运行的可执行文件的文件名或完整路径。

windows权限设置api函数例子

windows权限设置api函数例子

windows权限设置api函数例子在现代计算机系统中,操作系统的权限设置是非常重要的。

权限设置可以限制用户对系统资源的访问权限,保障系统的安全性和稳定性。

在Windows操作系统中,有许多API函数可以用来进行权限设置。

本文将介绍一些常用的Windows权限设置API函数,并给出相应的例子。

一、获取和修改进程的访问权限1. OpenProcess函数OpenProcess函数可以用来打开一个已存在的进程,并返回一个进程的句柄。

通过这个句柄,我们可以获得进程的访问权限,进而进行相应的操作。

2. AdjustTokenPrivileges函数AdjustTokenPrivileges函数可以修改当前进程的访问权限。

通过该函数,我们可以添加或删除特定的权限,以满足我们的需求。

例如,我们可以使用以下代码获取当前进程的访问权限:HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());接下来,我们可以使用以下代码修改当前进程的访问权限:DWORD dwOldPrivileges;TOKEN_PRIVILEGES tokenPrivileges;LookupPrivilegeValue(NULL, SE_DEBUG_NAME,&(tokenPrivileges.Privileges[0].Luid));tokenPrivileges.PrivilegeCount = 1;tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hProcess, FALSE, &tokenPrivileges,sizeof(TOKEN_PRIVILEGES), NULL, &dwOldPrivileges);二、获取和修改文件的访问权限1. CreateFile函数CreateFile函数可以用来打开或创建一个文件,并返回一个文件的句柄。

createprocessinternalw 参数

createprocessinternalw 参数

CreateProcessInternalW是一个 Windows API 函数,用于创建一个新的进程和它的主线程。

这个函数是CreateProcessW的内部实现版本,通常不直接使用。

以下是CreateProcessInternalW函数的参数:1.lpApplicationName: 指向要执行的模块的名称的指针。

如果此参数为NULL,则使用lpCommandLine参数。

2.lpCommandLine: 指向命令行字符串的指针。

如果此参数为NULL,则使用lpApplicationName参数。

3.lpProcessAttributes: 指向进程安全属性的指针。

如果此参数为 NULL,则使用lpThreadAttributes参数。

4.lpThreadAttributes: 指向线程安全属性的指针。

如果此参数为NULL,则使用lpProcessAttributes参数。

5.bInheritHandles: 如果为 TRUE,则新进程继承调用进程的句柄。

6.dwCreationFlags: 控制新进程的创建标志。

7.lpEnvironment: 指向新进程的环境块的指针。

如果此参数为NULL,则新进程使用调用进程的环境。

8.lpCurrentDirectoryName: 指向当前目录字符串的指针。

如果此参数为NULL,则新进程使用调用进程的当前目录。

9.lpStartupInfo: 指向 STARTUPINFO 或 STARTUPINFOEX 结构的指针,该结构指定了新进程的主窗口特性。

10.lpProcessInformation: 指向 PROCESS_INFORMATION 结构的指针,该结构接收有关新进程和新线程的信息。

请注意,这些参数和它们的含义可能会随着Windows 的不同版本而有所变化。

为了获得最准确和最新的信息,建议查阅Microsoft 的官方文档或相关资源。

windowsAPI函数中文详解

windowsAPI函数中文详解

windowsAPI函数中⽂详解WindowsAPI函数中⽂详解V1.0⽬录WindowsAPI函数中⽂详解V1.0 ----------------------------------------------------------------------------- 1 VC API常⽤函数简单例⼦⼤全 ---------------------------------------------------------------------------- 6第⼀个:FindWindow根据窗⼝类名或窗⼝标题名来获得窗⼝的句柄,该函数返回窗⼝的句柄------------------------------------------- 6第⼆个:SendMessage根据窗⼝句柄发送⼀个消息给窗⼝6第三个:GetCursorPos获取⿏标当前位置(屏幕) -------- 8第四个:WindowFromPoint根据坐标点获得对应的窗⼝句柄 -------------------------------------------------------------------------------- 9第五个MoveWindow根据窗⼝句柄移动窗⼝,改变窗⼝⼤⼩ ------------------------------------------------------------------------------- 10第六个ShowWindow设置窗⼝显⽰状态,如隐藏,最⼤化,最⼩化------------------------------------------------------------------------- 10第七个SetCursorPos设置⿏标的位置、把⿏标移动到指定的位置------------------------------------------------------------------------- 11第⼋个CopyFile复制⼀个⽂件-------------------------------------- 11第九个DeleteFile删除⼀个⽂件----------------------------------- 11第⼗个CreateDirectory创建⼀个⽂件夹(⽬录) --------- 11第⼗⼀个:GetClientRect获得窗⼝⼤⼩---------------------- 12第⼗⼆个:GetCWindowRect获得窗⼝⼤⼩(相对屏幕)12第⼗三个FindFirstFile寻找⽂件以及获得⽂件的信息------ 13第⼗四个FindNextFile寻找⽂件---------------------------------- 13第⼗五个MoveFile移动⽂件 ---------------------------------------- 14第⼗六个GetClassName根据窗⼝句柄获得窗⼝类名 ----- 14第⼗七个SetFileAttributes设置⽂件属性-------------------- 14第⼗⼋个ShellExecute运⾏⼀个程序函数定义:ShellExecute(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd); 第⼀个参数hwnd是⽗窗⼝的句柄,可以为NULL,第⼆个参数lpOperation表⽰⾏为,第三个参数lpFile是程序的路径名,第四个参数lpParameters是给所打开程序的参数,可以为NULL,第五个参数lpDirectory可以为NULL,第六个参数nShowCmd跟ShowWindow函数的第⼆个参数⼀样,作⽤也⼀样,如果打开的程序有窗⼝的话,这个参数就指明了窗⼝如何显⽰. 例如打开⼀个记事本:------------------- 16 第⼗九个PlaySound播放⼀个WAV⽂件--------------------- 16 第⼆⼗个GetModuleFileName根据模块导⼊表获程序的完整路径------------------------------------------------------------------------- 17 第⼆⼗⼀个CreateWindow创建⼀个窗⼝ -------------------- 17 第⼆⼗⼆个GetMessage获取窗⼝消息 ------------------------ 23 第⼆⼗三个RegisterClass注册窗⼝类,参照CreateWindow--------------------------------------------------------- 23 第⼆⼗四个UpdateWindow参照CreateWindow------ 23 第⼆⼗五个DispatchMessage参照CreateWindow-- 23 第⼆⼗六个LoadCursorFromFile从磁盘加载⼀个光标⽂件,函数返回该光标句柄------------------------------------------------ 23 第⼆⼗七个CreateSolidBrush创建⼀个画刷,函数返回画刷句柄------------------------------------------------------------------------- 23 第⼆⼗⼋个LoadImage装载位图、图标、光标函数-------- 24 第⼆⼗九个GetDC根据窗⼝句柄获取设备上下⽂(DC)返回DC句柄 ---------------------------------------------------------------------- 26 第三⼗个Rectnagle在窗⼝中画⼀个矩形 ---------------------- 26 第三⼗个CreateToolhelp32Snapshot给当前进程拍⼀个照 ------------------------------------------------------------------------------- 27 第三⼗⼀个Process32First根据CreateToolhelp32Snapshot函数返回的句柄获取进程信息------------------------------------------------ 27 第三⼗⼆个OpenProcess根据进程ID号获得进程句柄,句柄通过函数返回------------------------------------------------------------------- 28 第三⼗三个TerminateProcess结束⼀个进程(需进程句柄做参数)---------------------------------------------------------------------- 28 第三⼗四个CreatePen创建⼀个画笔(返回画笔句柄) --- 29第三⼗五个CreateSolidBrush创建⼀个画刷---------------- 29 第三⼗六个SelectObject把GDI对象选⼊相应的DC中 29 第三⼗七个 ReadProcessMemory根据进程句柄读取相应的⼀段内存(读其它进程⾥的内存) -------------------------------- 31 第三⼗⼋个WriteProcessMemory根据进程句柄写⼊相应的⼀段内存(写⼊其它进程⾥的内存)----------------------------- 32 第三⼗九个CreateThread创建⼀个线程(多线程)------- 33 第四⼗个GetCurrentProcessId获得当前进程ID ------- 35 第四⼗⼀个CreateCompatibleDC创建⼀个兼容的内存设备上下⽂(DC)----------------------------------------------------------- 35 第四⼗⼆个GetObject获取⼀个对象信息(如位图,图标,光标)------------------------------------------------------------------------- 35 第四⼗三个BitBlt在窗⼝输出⼀个位图 --------------------------- 35第四⼗四个GetWindowText根据窗⼝句柄获得窗⼝标题名37 第四⼗五个SetWindowText根据窗⼝句柄设置窗⼝标题名38 第四⼗六个GetCurrentProcess获得当前线程句柄------- 38第四⼗七个OpenProcessToken获得⼀个进程的访问令牌句柄 ---------------------------------------------------------------------------- 38 第四⼗七个LookupPrivilegeValue函数查看对应系统权限的特权值,返回信息到⼀个LUID结构体⾥上⾯讲过了,进程有权限⼀说,那么⼤家也能猜到,进程权限的信息也⼀定存储在⼀个结构体⾥,这个结构体描述了进程权限相关的⼀些信息。

createremotethread函数

createremotethread函数

createremotethread函数CreateRemoteThread函数是一个Windows API函数,用于向远程进程中创建一个新的线程,并在该线程中执行指定的函数。

该函数通常被用作一种远程代码注入技术,可以在不影响目标进程的情况下向其注入一些代码,从而达到一些计算机安全攻击的目的。

该函数有以下语法:```HANDLE CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);```其中,各个参数的含义如下:- `hProcess`:要在其中创建新线程的进程的句柄。

- `lpThreadAttributes`:指定线程对象的安全属性。

如果为NULL,则线程将继承调用进程的安全属性。

- `dwStackSize`:指定新线程的堆栈大小。

如果为0,则线程将使用父进程的堆栈大小。

- `lpStartAddress`:指定线程要执行的函数的地址。

- `lpParameter`:指定传递给线程函数的参数。

如果不需要参数,则应该传递NULL。

- `dwCreationFlags`:指定线程如何创建。

可以使用以下两个标志之一或二者的组合:- CREATE_SUSPENDED:创建线程时,线程进入挂起状态(不运行,只预分配资源)。

- 0:创建线程时,线程立即运行。

- `lpThreadId`:指向一个变量,该变量用于存储新线程的线程ID。

如果该参数为NULL,则新线程的线程ID不会被返回。

需要注意的是,CreateRemoteThread函数的使用是一种非常危险的操作,特别是在没有适当授权和许可的情况下使用。

进程相关的API函数

进程相关的API函数

进程相关的API函数0x01. ID与句柄如果我们成功创建⼀个进程之后,CreateProcess会返回四个数据,id和句柄句柄的话就是当前进程私有的句柄表索引(这是当前进程,给别进程也没⽤)每个进程都有⼀张⾃⼰的句柄表,这是私有的句柄表;⽽操作系统也有⼀张,叫全局句柄表,⾥⾯包含了所有的正在运⾏的进程和线程两种私有和全局的结构都是⼀样的看下代码,这个就是进程句柄,当进程创建成功后,这就是当前进程的句柄(私有)进程ID就是全局句柄表中的编号,也就是索引(全局)这个进程ID是全局的,唯⼀的,但是它不会永远不变的,当进程死了之后,再开启,ID就会变这边就使⽤代码来验证⼀下#include <stdio.h>#include <windows.h>BOOL CreateChildProcess(PTCHAR szChildProcessName, PTCHAR szCommandLine){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&pi, sizeof(pi));ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);//创建⼦进程返回成功与失败if (!CreateProcess(szChildProcessName, //对象名称(完整的路径+exe)szCommandLine, //命令⾏NULL, //不继承进程句柄NULL, //不继承线程句柄FALSE, //不继承句柄0, //没有创建标志NULL, //使⽤⽗进程环境变量NULL, //使⽤⽗进程⽬录作为当前⽬录,可以⾃⼰设置⽬录&si, //STARTUPINFOW结构体详细信息&pi) //PROCESS_INFOMATION结构体进程信息){printf("CreateChildProces Error: %d\n", GetLastError());return FALSE;}//打印进程printf("PID:%d ", pi.dwProcessId);printf("进程句柄:%#x\n", pi.hProcess);//printf("线程ID:%d ", pi.dwThreadId);//printf("线程句柄:%#x\n", pi.hThread);//获取进程信息/*SuspendThread(pi.hThread);ResumeThread(pi.hThread);*///释放句柄CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return TRUE;}int main(int argc, char* argv[]){//TCHAR szApplicationName[] = TEXT("D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe");TCHAR szApplicationName[] = TEXT("C:/Users/86183/Desktop/shellcode.exe");//TCHAR szCmdline[] = TEXT("ipconfig");CreateChildProcess(szApplicationName, NULL);getchar();return 0;}我们先把main函数的代码注释掉,然后再修改⼀下我们通过程序知道了句柄是 0xf8int main(int argc, char* argv[]){HANDLE hProcess;hProcess - (HANDLE)0xf8;//hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 0x);if (!TerminateProcess(hProcess, 1)){printf("终⽌进程失败: %d \n", GetLastError());}/*改好后如上我们把A 进程的句柄赋值给B 进程,然后我们直接运⾏看看看到了这边得到了报错码 6,我们直接去查看下这是什么错误这就验证我们的念想了,每个进程中的句柄都是私有的,把A 进程的句柄给 B 进程是没有⽤的,会显⽰句柄⽆效我们知道PID 是公有的,那我们就可以⽤PID 试试,换种玩法,涉及到了新函数,OpenProcessf1 查看下是什么,OpenProcess 打开已经存在的⼀个进程,有三个参数直接查看最后⼀个,获取PID 进⾏识别,因为PID 是全局的,所以可以识别第⼆个参数,判断打开的进程允不允许⼦进程是否继承它(⽗进程就是我写的这个程序)第⼀个参数,你要打开的进程希望拥有什么权利,是拥有创建进程的权利,还是创建进程的,还是所有的当我们启动这个进程的时候就会杀掉下⾯那个程序,最后发现成功关闭了0x02. 以挂起的形式创建进程我们F1看下第 6 个参数 dwCreationFlags 是什么其实我们之前创建的代码都是公⽤⼀个窗⼝这是 的 可以选择新创建⼀个控制台,具体可以⾃⼰试试然后这边以挂起的⽅式创建,流程就会变当⾛到这的时候进程已经创建好了,还有映射和线程还没做,所以我们可以在下⾯做些⼩动作具体还可以换成恶意程序,这边使⽤for 循环来演⽰,如果这个循环没有执⾏完,这个进程就不会启动执⾏完了也不能继续跑,因为我们要放开它,让它继续跑,要使⽤ ResumeThread() 这个函数实验代码就在如下:/*//TCHAR szApplicationName[] = TEXT("D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe");TCHAR szApplicationName[] = TEXT("C:/Users/86183/Desktop/shellcode.exe");//TCHAR szCmdline[] = TEXT("ipconfig");CreateChildProcess(szApplicationName, NULL);*/getchar();return 0;}CreateProcessW(LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles,DWORD dwCreationFlags, / LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation );CreateProcess CreationFlags 1、映射EXE ⽂件2、创建内核对象`EPROCESS`3、映射系统DLL (ntdll.dll )4、创建线程内核对象`ETHREAD`5、如果是挂起的⽅式创建的:然后就能在这边做其他的.......6、恢复以后再执⾏映射DLL (ntdll.LdrlnitializeThunk )线程开始执⾏#include <stdio.h>#include <windows.h>BOOL CreateChildProcess(PTCHAR szChildProcessName, PTCHAR szCommandLine){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&pi, sizeof(pi));ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);//创建⼦进程 返回成功与失败if (!CreateProcess(szChildProcessName, //对象名称(完整的路径+exe )szCommandLine, //命令⾏NULL, //不继承进程句柄NULL, //不继承线程句柄FALSE, //不继承句柄CREATE_SUSPENDED, //没有创建标志NULL, //使⽤⽗进程环境变量NULL, //使⽤⽗进程⽬录作为当前⽬录,可以⾃⼰设置⽬录NULL, //使⽤⽗进程⽬录作为当前⽬录,可以⾃⼰设置⽬录&si, //STARTUPINFOW结构体详细信息&pi) //PROCESS_INFOMATION结构体进程信息){printf("CreateChildProces Error: %d\n", GetLastError());return FALSE;}//打印进程printf("PID:%d ", pi.dwProcessId);printf("进程句柄:%#x\n", pi.hProcess);for (int i = 0; i < 5; i++){Sleep(1000);printf("---------------------------\n");}ResumeThread(pi.hThread);//printf("线程ID:%d ", pi.dwThreadId);//printf("线程句柄:%#x\n", pi.hThread);//获取进程信息/*SuspendThread(pi.hThread);ResumeThread(pi.hThread);*///释放句柄CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return TRUE;}int main(int argc, char* argv[]){//HANDLE hProcess;////hProcess = (HANDLE)0xf8;//hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 6124);//if (!TerminateProcess(hProcess, 1))//{// printf("终⽌进程失败: %d \n", GetLastError());//}//TCHAR szApplicationName[] = TEXT("D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe");TCHAR szApplicationName[] = TEXT("C:/Users/86183/Desktop/shellcode.exe");//TCHAR szCmdline[] = TEXT("ipconfig");CreateChildProcess(szApplicationName, NULL);getchar();return 0;}然后CreateProcess还有四个参数没讲CreateProcessW(LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment, //使⽤⽗进程环境变量,没啥的,NULL就可以了LPCWSTR lpCurrentDirectory, //使⽤⽗进程⽬录作为当前⽬录,可以⾃⼰设置⽬录LPSTARTUPINFOW lpStartupInfo //STARTUPINFOW结构体详细信息LPPROCESS_INFORMATION lpProcessInformation //PROCESS_INFOMATION结构体进程信息 );int main(int argc, char* argv[]){//HANDLE hProcess;////hProcess = (HANDLE)0xf8;//hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 6124);//if (!TerminateProcess(hProcess, 1))//{// printf("终⽌进程失败: %d \n", GetLastError());//}//TCHAR szApplicationName[] = TEXT("D:/Program Files/Tencent/QQ/Bin/QQScLauncher.exe");//TCHAR szApplicationName[] = TEXT("C:/Users/86183/Desktop/shellcode.exe");//TCHAR szCmdline[] = TEXT("ipconfig");//CreateChildProcess(szApplicationName, NULL);wchar_t strModule[256];GetModuleFileName(NULL, strModule, 256); //获取当前exe所在的路径(得到当前模块路径)wchar_t strWork[1000];int i = 1000;int i = 1000;GetCurrentDirectory(1000, strWork); //得到当前⼯作路径printf("模块路径: %s \n⼯作路径:%s \n", strModule, strWork); getchar();return 0;}exe在哪⾥,模块路径就在哪⾥⼯作路径就是创建进程的地⽅lpCurrentDirectory可以设置成null,那这个有什么意义吗?⽐如我们之前读取⽂件函数FILE* fp = fopen("A.exe","r")这个时候就会在当前⽬录找,0x03. 其他进程相关的API:获取进程PIDGetCurrentProcessid获取进程句柄GetCurrentProcess获取命令⾏GetCommandLine获取启动信息GetStartupInfo遍历进程IDEnumProcesses快照CreateToolhelp32Snapshot。

WindowsAPI大全

WindowsAPI大全

WindowsAPI大全API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

什么是windows APIWindows API是一套用来控制Windows的各个部件(从桌面的外观到为一个新进程分配的内存)的外观和行为的一套预先定义的Windo ws函数.用户的每个动作都会引发一个或几个函数的运行以告诉Wind ows发生了什么.这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法. 这也就是说,你用VB写出的每行代码都会被VB转换为API 函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数. 。

同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Butt on_Click).API函数包含在Windows系统目录下的动态连接库文件中(如Us er32.dll,GDI32.dll,Shell32.dll...).API 声明正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL 文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer. 要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.你将会遇到一些问题:假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用. 在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.API 分为四种类型:远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现程序间的通信。

createprocessa 参数

createprocessa 参数

一、关于CreateProcessA函数的概述CreateProcessA函数是Windows操作系统中的一个API函数,用于创建一个新的进程并在其中执行指定的可执行文件。

该函数是Windows API中的一部分,其主要作用是创建一个新的进程并且可以指定该进程的一些属性,比如可执行文件的路径、命令行参数、进程安全属性等。

CreateProcessA函数属于Windows API的一个子集,它用于与ASCII字符集兼容的版本。

二、CreateProcessA函数的参数CreateProcessA函数的参数包括10个,分别是:1. lpApplicationName:表示要运行的可执行文件的名称。

如果lpApplicationName为NULL,则该参数表示命令行参数中的第一个字符串。

2. lpCommandLine:表示要传递给正在创建的进程的命令行字符串。

lpCommandLine参数可以包含可执行文件的路径和命令行参数。

3. lpProcessAttributes:表示新进程的安全属性。

如果lpProcessAttributes为NULL,则新进程的安全属性继承自其父进程,通常是以继承方式创建进程。

4. lpThreadAttributes:表示新进程的主线程的安全属性。

如果lpThreadAttributes为NULL,则新线程的安全属性继承自其父进程。

5. bInheritHandles:一个布尔值,用于确定新进程是否继承父进程的句柄表。

如果bInheritHandles为TRUE,则新进程将继承父进程的句柄表。

6. dwCreationFlags:用于指定进程创建的标志。

这个参数决定了创建的进程的一些属性,比如是否为一个控制台应用程序、创建的进程优先级等。

7. lpEnvironment:指定新进程的环境块。

如果lpEnvironment为NULL,则新进程使用父进程的环境。

8. lpCurrentDirectory:指定新进程的当前目录。

CreateThread()与beginthread()的区别详细解析

CreateThread()与beginthread()的区别详细解析

CreateThread()与beginthread()的区别详细解析我们知道在Windows下创建⼀个线程的⽅法有两种,⼀种就是调⽤Windows API CreateThread()来创建线程;另外⼀种就是调⽤MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。

相应的退出线程也有两个函数Windows API的ExitThread()和CRT的_endthread()。

这两套函数都是⽤来创建和退出线程的,它们有什么区别呢?很多开发者不清楚这两者之间的关系,他们随意选⼀个函数来⽤,发现也没有什么⼤问题,于是就忙于解决更为紧迫的任务去了,⽽没有对它们进⾏深究。

等到有⼀天忽然发现⼀个程序运⾏时间很长的时候会有细微的内存泄露,开发者绝对不会想到是因为这两套函数⽤混的结果。

根据Windows API和MSVC CRT的关系,可以看出来_beginthread()是对CreateThread()的包装,它最终还是调⽤CreateThread()来创建线程。

那么在_beginthread()调⽤CreateThread()之前做了什么呢?我们可以看⼀下_beginthread()的源代码,它位于CRT源代码中的thread.c。

我们可以发现它在调⽤CreateThread()之前申请了⼀个叫_tiddata的结构,然后将这个结构⽤_initptd()函数初始化之后传递给_beginthread()⾃⼰的线程⼊⼝函数_threadstart。

_threadstart⾸先把由_beginthread()传过来的_tiddata结构指针保存到线程的显式TLS数组,然后它调⽤⽤户的线程⼊⼝真正开始线程。

在⽤户线程结束之后,_threadstart()函数调⽤_endthread()结束线程。

并且_threadstart还⽤__try/__except将⽤户线程⼊⼝函数包起来,⽤于捕获所有未处理的信号,并且将这些信号交给CRT处理。

操作系统API使用方法

操作系统API使用方法

系统API‎使用方法一、OpenP‎r oces‎s函数用来打‎开一个已存‎在的进程对‎象,并返回进程‎的句柄。

HANDL‎E OpenP‎r oces‎s(DWORD‎dwDes‎i redA‎c cess‎, //渴望得到的‎访问权限(标志)BOOL bInhe‎r itHa‎n dle, // 是否继承句‎柄DWORD‎dwPro‎c essI‎d// 进程标示符‎); 用来打开一‎个已存在的‎进程对象,并返回进程‎的句柄。

返回值:如成功,返回值为指‎定进程的句‎柄。

如失败,返回值为空‎,可调用Ge‎t Last‎E rror‎获得错误代‎码。

举例HANDL‎E hProc‎e ss = OpenP‎r oces‎s( PROCE‎S S_AL‎L_ACC‎E SS, FALSE‎, pID );附: BOOL ReadP‎r oces‎s Memo‎r y( HANDL‎E hProc‎e ss, PVOID‎pvAdd‎r essR‎e mote‎, PVOID‎pvBuf‎f erLo‎c al, DWORD‎dwSiz‎e, PDWOR‎D pdwNu‎m Byte‎s Read‎);参数hProc‎e ss //为远程进程‎的句柄pvAdd‎r essR‎e mote‎//用于指明远‎程进程中的‎地址pvBuf‎f erLo‎c al //是本地进程‎中的内存地‎址dwSiz‎e //是需要传送‎的字节数pdwNu‎m Byte‎s Read‎和pdwN‎u mByt‎e sWri‎t ten //用于指明实‎际传送的字‎节数.当函数返回‎时,可以查看这‎两个参数的‎值.二、GetCu‎r r ent‎P r oce‎s sHANDL‎E WINAP‎I GetCu‎r rent‎P roce‎s s( VOID );说明:获取当前进‎程的一个句‎柄返回值:为当前进程‎的句柄注解:只要当前进‎程需要一个‎进程句柄,就可以使用‎这个伪句柄‎。

深入浅出 windows api 程序设计

深入浅出 windows api 程序设计

深入浅出windows api 程序设计全文共四篇示例,供读者参考第一篇示例:深入浅出Windows API程序设计Windows API是Windows操作系统所提供的一组接口,允许开发者与操作系统进行交互,控制、管理和定制系统资源。

通过调用Windows API,开发者可以实现各种功能,包括但不限于文件操作、窗口管理、内存管理、网络通信等等。

深入掌握Windows API程序设计,可以让开发者更加灵活地处理系统资源,提高程序性能和用户体验。

本文将通过实例介绍Windows API程序设计的基本原理和常用技巧,帮助读者快速上手和深入了解Windows API。

Windows API是一组由微软公司定义和支持的应用程序编程接口,包括了一系列的函数、结构体和常量。

开发者可以通过调用这些接口,实现对操作系统资源的操作和控制。

Windows API可以分为用户界面API和系统服务API两类。

用户界面API包括了一系列函数,用于创建、管理和处理用户界面元素,如窗口、按钮、菜单等。

其中最常用的函数包括CreateWindow、SendMessage、GetDlgItem、SetWindowText 等。

系统服务API则包括了一系列函数,用于访问系统资源和执行系统级操作,如文件操作、注册表访问、进程管理等。

常用的系统服务API函数包括CreateFile、RegOpenKey、EnumProcesses等。

Windows API程序设计的基本原理是通过调用API函数,与操作系统进行交互并控制系统资源。

在使用Windows API进行程序设计时,需要注意以下几点:1. 导入API函数:在使用Windows API时,需要先导入对应的API函数。

可以通过声明函数原型的方式告诉编译器需要调用的函数及其参数,然后利用LoadLibrary和GetProcAddress函数来获取函数的地址。

2. 创建消息循环:在Windows程序中,消息循环是至关重要的部分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用API在Windows下创建进程和线程
前言:
谈到在Windows创建线程的例子,在网上的很多的参考都是基于MFC的。

其实,就操作系统实验这个前提而言,大可不必去碰那个大型的MFC的框架。

在Windows命令控制台下可创建进程及线程,做些简单的进程及线程的测试程序。

1、实验准备:
要实验的Windows下的多线程实验,应做如下准备:
a) 在新建中选”Win32 Console Application”的An empty project
b) 选”工程”的”设置”选项,在”设置”中选择“C/C++”标签,在”Project Option”中,将”MLd”参数改成“MTd”(如图1)。

图1 选项
以上两步对实验成功至关重要,否则,即是代码无误,在连接时同样会出现问题。

2、Windows下进程的创建:
Windows的进程和线程模型被描述成”多进程,基于单进程的多线程”。

在创建一个线程时,Windows会做大量的工作---创建一个新的地址空间,为进程分配资源以及创建一个基线程。

CreateProcess函数的原型如下:
虽然有很多参数,不过在现阶段的实验级别,大多数参数只要用默认值即可。

下面要做的关于Windows使用进程的实验,在Linux系统下,可以使用类似:
execve(char* cmdName ,char* cmdArgu)的语句从一个程序中去执行其它的程序。

而如果在Windows下,当使用CreateProcess去执行相应的功能时,只要去改变cmdLine中的容即可,其它的参数使用默认值,具体见代码1:
代码1执行的功能是从命令行中启动这个名叫的launch的测试程序,在launch后面应加上保存有需要打开程序路径的文件名:
如在命令行中键入:
>launch set.txt
而set.txt中的容为:
C:\\WINDOWS\\SYSTEM32\\CALC.EXE
C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE NEW.TXT
C:\\WINDOWS\\SYSTEM32\\CHARMAP.EXE
路径的前半部分为”C:\\WINDOWS\\”,这当然要视你的Windows系统的类型以及系统盘的存放位置而定。

如果是NT或2000的机器,则应使用WINNT.
/*测试程序1:
示例如使用进程的launch程序(启动程序),通过在命令行中加载相应的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行*/
通过上面这段极其简洁的代码,完成了看似有些难度的任务,让我们充分感受到采用一些高级的编程手段所带来的便捷与高效.
3、Windows线程的创建及实验:
3.1 使用CreateThread在Windows下创建线程:
在Windows中创建线程可以调用两个函数_beginthreadex和CreateThread两个函数,这里只介绍后者。

CreateThread函数(在主线程基础上创造新的线程)原型:
其中,在本实验阶段比较重要的参数是第三和第四个:
a)第三个参数是一个指向函数的指针,所以应传入的参数应为函数的地址,如&Func 的形式.而这个传入的参数,则必须被声明成为:
的形式.这个函数也就是要执行线程任务的那个函数体实体.这里应注意,传入应使用Func而非&Func。

如:CreateThread(NULL,0,Func,…)
具体原因:我目前认为是系函数前部使用WINAPI所致。

b)第四个参数应是执行线程任务的函数体实体所需要的参数,即上面所举例的函数threadFunc的参数threadArgu,这在WINDOWS中被定义成一个LPVOID的类型,目前我认为,可以把它在功能上看成和void* 类似。

参考:LPVOID的原型:
所以,当你有自己需要的类型的参数传入时,可以用
将你想要传入的参数装入一个结构体中。

在传入点,使用类似:
在函数threadFunc部的接收点,可以使用“强行转换”,如:
3.2 线程实验1---创建N个随机线程,所有线程的执行时间均为T秒,观察每个线程的运行状况:
为了使线程的运行趋于随机化,应先使用:
在每个线程的运行中,每个线程的睡眠时间为:
这样,可以使进程的运行趋于随机化.
3.3 线程实验2---Windows下可创建的线程的数目的测试:
这里使用的是让测试线程睡眠100秒,如果用的是让测试进程进入死循环的法,则会很快让系统僵掉。

在Windows XP下(赛扬800MHZ,256M存),在上述式下,测得可创建的最多的线程数目为2030个.
3.4 线程实验3---最简单的一个临界资源的读者,写者程序.
这个程序要实现的是最简单的读者,写者程序,读者将1~10十个数字依次填入临界资源区gData,当且仅当gData被读者消费后,写者才可以写入下一个数.
3.5 几点说明:
3.5.1 主调用程序在结束时使用Sleep(5000)的意图在于:使得由它所产生的子线程可以在主进程结束之前,完成如资源释放一类的工作。

3.5.2 在随机线程产生测试程序中:
之所以采用在每个线程部用
srand((unsigned int)time (NULL));
去初始化每个线程,是为了使得所有的线程拥有自己的随机数种子,否则,如果是在主调用程序中去初始化随机数种子数,则所有的线程得到的随机数序列都是一样的,将无法产生随机效果。

4、应用及推广:
采用这种在Windows下利用控制台调用Windows API进行操作系统实验的法,具有代码简洁,观察效果好与实现目标接近等优点。

相关文档
最新文档