以前看书时记得一些笔记(一),很早了,现在再看都有些看不懂了
API:
1.DWORD ResumeThread(HANDLE hThread)
恢复线程的为可调度状态。如果函数执行成功,则返回线程前一个暂停计数,如果 则返回0xFFFFFFFF
2.DWORD SuspendThread(HANDLE hThread)
让线程暂停,即让线程为不可调度状态,如函数执行成功,则返回线程前一个暂停 计数,如失败,则返回0xFFFFFFFF
3. HANDLE WINAPI CreateToolhelp32Snapshot
(
DWORD dwFlags,
DWORD th32ProcessID
);
创建一个进程内的关于进程,或线程,或堆,或模块的快照对象,如成功,则返回该快照的句柄。dwFlags可以表示为:TH32CS_INHERIT、TH32CS_SNAPALL、TH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPPROCESS、TH32CS_SNAPTHREAD;而th32ProcessID则为进程的ID号。
4.THREADENTRY32/MODULEENTRY32/PROCESSENTRY32/HEAPENTRY32/结构:
中文解释的不清楚,用英文表示吧:Describes an entry from a list that enumerates the threads executing in the system when a snapshot was taken
5. BOOL WINAPI Thread32First(
HANDLE hSnapshot,
LPTHREADENTRY32 lpte
);
得到有关于进程内的线程的一些信息,这些信息储存在lpte指向的THREADENTRY32结构中。其余的包括module,process,heap等都是差不多的,但是,它首先要获得一个线程快照,可以用CreateToolhelp32Snapshot来创建
6. VOID Sleep(DWORD dwMilliseconds);
让线程睡眠dwMilliseconds时间。这些时间内系统不能调度该线程。过了这些时间,线程自动苏醒,可以调度。当然,由于widnows不是实时系统,所以,dwMilliseconds则是大约的时间。另外,可以向参数传递INFINITE以告诉系统该线程永远不会苏醒。
7. BOOL SwitchToThread();
让系统从该线程1转换到另一个线程2。但是,该线程1还是在可调度状态。只是不是正在被执行的线程罢了。如果调用S w i t c h To T h r e a d函数时没有其他线程能够运行,那么该函数返回FA L S E,否则返回一个非0值。
8. BOOL GetThreadTimes(
HANDLE hThread,
PFILETIME pftCreationTime, //创建时间
PFILETIME pftExitTime, //退出时间
PFILETIME pftKernelTime, //内核时间
PFILETIME pftUserTime); //用户时间
GetThreadTimes返回线程执行时四种不同时间的值,如下:
创建时间 用英国格林威治时间1 6 0 1年1月1日午夜后1 0 0 n s的时间间隔表示的英国绝对值,用
于指明线程创建的时间
退出时间 用英国格林威治时间1 6 0 1年1月1日午夜后1 0 0 n s的时间间隔表示的英国绝对值,用于指明线程退出的时间。如果线程仍然在运行,退出时间则未定义
内核时间 一个相对值,用于指明线程执行操作系统代码已经经过了多少个1 0 0 n s的C P U时间
用户时间 一个相对值,用于指明线程执行应用程序代码已经经过了多少个1 0 0 n s的C P U时间
9. BOOL GetProcessTimes(
HANDLE hProcess,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);
这是返回关于进程的时间值。类似于线程。但有一点:G e t P r o c e s s Ti m e s返回的时间适用于某个进程中的所有线程(甚至是已经终止运行的线程)。例如,返回的内核时间是所有进程的线程在内核代码中经过的全部时间的总和。
10.BOOL GetThreadContext(HANDLE hThread,PCONTEXT pContext)
获得context结构中保存的寄存器的值。
若要调用该函数,只需指定一个C O N T E X T结构,对某些标志(该结构的C o n t e x t F l a g s成员)进行初始化,指明想要收回哪些寄存器,并将该结构的地址传递给G e t T h r e a d C o n t e x t。然后该函数将数据填入你要求的成员。
注意:在GetThreadContext前,需调用SuspendThread来暂停线程的运行。
还要注意:C O N T E X T结构的C o n t e x t F l a g s成员并不与任何C P U寄存器相对应。无论是何种C P U结构,该成员存在于所有C O N T E X T结构定义中。C o n t e x t F l a g s成员用于向G e t T h r e a d C o n t e x t函数指明你想检索哪些寄存器。例如,如果想要获得线程的控制寄存器,可以编写下面的代码:
CONTEXT context;
context.ContextFlags = CONTEXT_CONTROL;
GetThreadContext(hThread,&context);
在调用GetThreaadContext之前,要注意对context结构中的ContextFlags进行初始化,当然,你也可以获得控制寄存器和整数寄存器,就象下面一样:
context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
还可以获得全部寄存器,只要传递CONTEXT_FULL即可。
11.BOOL SetThreadContext(HANDLE hThread,CONST CONTEXT* pContext)
修改线程中Context结构中保存的寄存器的值。当然,也要首先暂停(Suspend)线程的执行。另外,在调用SetThreadContext函数前,也要对Context的ContextFlags进行初始化。
12.创建文件内核对象:HANDLE CreateFile(LPCTSTR lpszName, DWORD fdwAccess, DWORD fdwShareMode,
LPSECURITY_ATTRIBUTES lpsa, DWORD fdwCreate, DWORD fdwAttrsAndFlags, HANDLE hTemplateFile);
函数说明:lpszName是指向以NULL结尾的字符串,该字符串是用来命名文件,管道或其他要打开或创建的对象。
fdwAcess利用GENERIC_READ和GENERIC_WRITE来指定文件的读和写访问。这两个参数也可以用 | 来结合。
fdwShareMode是下列值的按位的结合,它有下面几个值:
0:文件不能共享,甚至一个进程不能打开关于此文件的第二个句柄。
FILE_SHARE_READ:进行此调用的进程在内的其它进程能够在打开文件的同时进行读取访问。
FILE_SHARE_WRITE:该标志允许同时对文件进程写操作。
lpsa是指个SECURITY_ATTRIBUTES结构的参数,它指定了文件内核对象的安全特性。
fdwCreate指定是否创建一个新文件、是否覆盖已存在的文件等等。
fdwAttrsAndFlags指定文件的属性和标志,一般文件只设置为FLIE_ATTRIBUTE_NORMAL.
hTemplateFile是打开GENERIC_READ文件的句柄,此参数通常为NULL。
13.关闭文件内核对象:BOOL CloseHandle (Handle hObject)
函数说明,关闭文件对象,使文件内核对象引用计数减1.。如果函数成功,则返回TRUE,否则,返回FALSE。
14.读取文件:BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped)
参数说明,hFile是文件句柄,lpBuffer是指向接收输入数据的内存缓冲区,nNumberOfBytesToRead是从文件中读取的字节数,lpNumberOfBytesRead是指向
实际的读取的字节。如果句柄位于文件尾,此值会为0。lpOverlapped是指向一个OVERLAPPED结构。
15.写文件:BOOL WriteFile (HANDLE hFile, CONST VOID*lpBuffer, DOWRD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped)
参数说明:与ReadFile函数参数功能差不多。可见ReadFile函数。
16.获得标准设备的句柄:HANDLE GetStdHandle(DOWRD nStdHandle)
参数说明:nStdHandle必须是下列值之一:STD_INPUT_HANDLE,获得标准输入设备的句柄。STD_OUTPUT_HANDLE,获得标准输出设备的句柄。STD_ERROR_HANDLE获得标准错误设备的句柄。
17.设置标准输入、标准输出、标准错误设备句柄的函数:BOOL SetStdHandle(DOWRD nStdHandle, HANDLE hHandle)
参数说明:nStdHandle具有与GetStdHandle函数相同的可能值。hHandle指定一个标准设备的打开文件。
18.删除文件:BOOL DeleteFile (LPCTSTR lpszFileName)
注:在Win2000/NT中,不能删除一个已打开的文件,但在Win9x中可以。
19.复制文件:BOOL CopyFile (LPCTSTR lpszExistingFile, LPCTSTR lpszNewFile, BOOL fFailIfExists)
注:fFailIfExists为Flase时,如果该文件已存在,则会被覆盖,如为TRUE,则不会。另外,也可以用CreateFile加ReadFile、WriteFile来复制文件。
20.移动文件(亦指剪切文件):BOOL MoveFile (LPCTSTR lpszExisting, LPCTSTR lpszNew)
BOOL MoveFileEx(LPCTSTR lpszExisting, LPCTSTR lpszNew, DWORD fdwFlags)
注:如果新文件已存在,则调用MoveFile会失败,对于已存在的文件就要调用MoveFileEx函数。fdwFlags指定了移动文件的几个选项,详见MSDN.
21.创建或删除目录: BOOL CreateDirectory (LPCTSTR lpszPath, LPSECURITY_ATTRIBUTES lpsa)
BOOL RemoveDirectory (LPCTSTR lpszPath)
22.设置当前目录和获得当前目录:BOOL SetCurrentDirectory (LPCTSTR lpszCurDir)
BOOL GetCurrentDirectory (DWORD cchCurDir, LPTSTR lpszCurDir)
23.设置文件指针(亦指文件句柄)指向文件的任何位置。DWORD SetFilePointer (HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHign,
DWORD dwMoveMethod)
由于CreateFile会返回指向文件的指针(句柄),并且它的位置为0,即文件的开始处,然后可以通过ReadFile和WriteFile来移动该指针指向文件的位置。但是,可以利用SetFilePointer来将文件指针设置成任意值的能力。
参数说明:hFile是已打开文件的句柄。lDistanceToMove是有符号LONG时,是表示移动的距离;而当它是无符号时表示文件的位置。lpDistanceToMoveHign指向移动距离的高位部分,dwMoveMethod表示移动模式,有如下选项:FILE_BEGIN—开始位置是文件头,认为DistanceToMove是无符号的。FILE_CURRENT—从当前位置向前或向后移动指向,认为DistanceToMove是有符号的,参数为正时,向前移动。FILE_END—从文件结尾向后或向前移动。
通过指定从文件结尾移动零长度的话,该函数就可以得到文件的大小。
24.Windows 2000/NT提供另外设置文件的方法,该方法不需要调用SetFilePointer。ReadFile和WriteFile最后的参数都是Overlapped结构,该结构有两个成员,分别是Offset和OffsetHign。用户可以在偏移结构中设置适当的值,I/O操作就会从指定的文件开始。但是,注意:文件的指针并没有发生改变,该结构也有一个成员hEvent,必须将其设为NULL。
25.获取文件大小:DWORD GetFileSize (HANDLE hFile, LPDWORD lpdwFIleSizeHign)
返回值,文件大小的低位项。0xFFFFFFFF表示可能调用失败。
26.文件属性和目录处理:为了查找符合指定名称模式的文件和其它目录,并同时获得文件属性,有可能要搜索目录。搜索需要一个由FIndFirstFile函数获得的“搜索句柄(search handle)”。利用FindNextFile获得指定文件,并且查找将以FindClose结束。
HANDLE FindFirstFile (LPCTSTR lpszSearchFile, LPWIN32_FIND_DATA lpffd)
返回值,一个搜索句柄。INVALID_HANDLE_VALUE表示失败。lpffd是表示搜索文件的一些信息。
BOOL FindNextFile (HANDLE hFindFile, LPWIN32_FIND_DATA lpffd)
用FindFirstFile获得的搜索句柄,然查找有汉有找到文件。
搜索完后,可以用BOOL FindClose(HANDLE hFindFile)来关闭相应的文件句柄。注意,不是调用CloseHandle来关闭它。
27.获得文件的时间戳:BOOL GetFileTime (HANDLE hFile, LPFILETIME lpftCreation, LPFILETIME lpftLastAcess, LPFILETIME lpftLastWrite)
这个函数获得的时间值(FILETIME结构)都是64无符号整数,有些函数可以方便的操作这些结构,以便转化成需要的时间:
FileTimeToSystemTime 把文件时间分割成年、秒和微秒等独立的单元。这些单元适合如显示,打印等操作。
SystemTimeToFileTime,上面函数的过程颠倒。
CompareFileTime 比较两个文件时间的大小,小于为-1,等于为0,大于为1.
SetFileTime 改变时间戳。
FileTimeToLocalFileTime和LocalFileTimeToFileTime 表示UTC和当地时间之间进行转换。
28.获得文件属性:DWORD GetFileAttributes (LPCTSTR lpszFileName) 文件的属性是在CreateFile中设置的。
设置文件属性:BOOL SetFIleAttributes(LPCTSTR lpFileName, DWORD dwFileAttributes
)
29.
创建临时文件:
UINT GetTempFileName (LPCTSTR lpszPath, LPCTSTR lpszPrefix, UINT uUnique, LPTSTR lpszTempFile)
30.
锁定文件和解锁定文件:
BOOL LockFileEx(
HANDLE hFile, // handle of file to lock
DWORD dwFlags, // functional behavior modification flags
DWORD dwReserved, // reserved, must be set to zero
DWORD nNumberOfBytesToLockLow, // low-order 32 bits of length to lock
DWORD nNumberOfBytesToLockHigh, // high-order 32 bits of length to lock
LPOVERLAPPED lpOverlapped // addr. of structure with lock region start offset );
BOOL UnlockFileEx(
HANDLE hFile, // handle of file to unlock
DWORD dwReserved, // reserved, must be set to zero
DWORD nNumberOfBytesToUnlockLow, // low order 32-bits of length to unlock
DWORD nNumberOfBytesToUnlockHigh. // high order 32-bits of length to unlock
LPOVERLAPPED lpOverlapped // addr. of struct. with unlock region start offset );