typedef unsigned short u16; typedef char s8 ; typedef int s32; typedef short s16; typedef char * pchar Find_Work_Name(_work headler,pchar work_name) ; //执行子任务----根据任务名称来执行 s32 Run_work_for_work_name(_work headler,pchar work_name) ; //销毁一个子任务 s32 Destroy_cwork(_work headler,pchar work_name); //销毁全部任务 _work headler,pchar work_name) ; //销毁一个子任务 s32 Destroy_cwork(_work headler,pchar work_name); //销毁全部任务 _work Find_Work_Name(_work headler,pchar work_name) { assert(headler !
#include <ntddk.h>NTKERNELAPI PCHAR PsGetProcessImageFileName(PEPROCESS Process);NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);PCHAR GetProcessNameByProcessId(HANDLE ProcessId){NTSTATUS st = STATUS_UNSUCCESSFUL;PEPROCESS ProcessObj = NULL;PCHAR string = NULL;st = PsLookupProcessByProcessId PEPROCESS Process);NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);PCHAR GetProcessNameByProcessId(HANDLE ProcessId){NTSTATUS st = STATUS_UNSUCCESSFUL;PEPROCESS ProcessObj = NULL;PCHAR
#include <ntddk.h> NTKERNELAPI PCHAR PsGetProcessImageFileName(PEPROCESS Process); NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process); PCHAR GetProcessNameByProcessId(HANDLE ProcessId) { NTSTATUS st = STATUS_UNSUCCESSFUL; PEPROCESS ProcessObj = NULL; PCHAR string = NULL; PEPROCESS Process); NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process); PCHAR 检测线程需要调用PsSetCreateThreadNotifyRoutine 创建回调函数,然后就可以检测线程的创建了,具体代码如下: #include <ntddk.h> NTKERNELAPI PCHAR
staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 ___ pChar3在哪里?____ *pChar3在哪里?____ ptr1在哪里?____ *ptr1在哪里? : 是一个由const修饰的字符类型指针,指针指向的内容不能改变, 说明"abcd"是一个常量字符串,内容不能被修改,处于栈 *pchar3 :由于"abcd"是一个常量字符串,pchar3指向常量字符串 (num1)=40 - sizeof(char2):单独当在sizeof内部,数组名代表整个数组,abcd\0,sizeof(char2)=5 - sizeof(pChar3):pChar3是一个指针, 所以sizeof(pChar3)=4/8 strlen(pChar3):pChar3代表首元素地址,strlen为从给予的地址开始 到'\0'结束,strlen(pChar3)=4 - sizeof
_A pChar3在哪里?A *pChar3在哪里?D ptr1在哪里?A *ptr1在哪里? *pChar3:const char* pChar3 = "abcd"; 中的字符串字面量 "abcd" 存储在只读的数据段(常量区)中。 而pChar3 本身是一个指针变量,存储在栈上,它指向常量区中的字符串。由于字符串字面量是只读的,所以通过 *pChar3 我们只能读取字符串的内容,而不能修改它。 *pChar3 在栈中, pChar3 在代码段(常量区),指针变量 pChar3 存储在栈中,*pChar3 指向一个字符串常量,该字符串常量存储在代码段(常量区)中,代码段(常量区)用于存储程序中的常量数据 sizeof(pChar3) = 8; strlen(pChar3) = 4; pChar3 是一个指向字符串常量 "abcd" 的指针,在 32 位系统上,指针大小为 4 字节。
printf("Before copy : %s\n", c); strcpy(c, a); printf("After copy : %s\n", c); char *pchar ; pchar = strchr(a, 'o'); printf("Character : %s\n", pchar); pchar = strstr(a, "our"); printf("String : %s\n", pchar); return 0; } string length = 20 Compare a to a : 0 Before copy :
入口函数为PosPayOperate function PosPayOperate(OpType: Integer; const InPara: PChar; OutPara, OutMsg: PChar SMCzkYw_DLL = 'PosPayIntf.dll'; //调用动态库名称 function PosPayOperate(OpType: Integer; const InPara: PChar ; OutPara, OutMsg: PChar): Integer; export; stdcall; ? 然后在implementation下面加入 function PosPayOperate(OpType: Integer; const InPara: PChar; OutPara, OutMsg: PChar): Integer; external POSPAY_DLL; ?
1.3 typedef 与指针的结合使用 typedef char * PCHAR; int main (void) { //char * str = "学嵌入式"; PCHAR str = "学嵌入式"; printf ("str: %s\n", str); return 0; } 在上面的demo程序中,PCHAR 的类型是 char *,我们使用PCHAR类型去定义一个变量str typedef char* PCHAR1; #define PCHAR2 char * int main (void) { PCHAR1 pch1, pch2; PCHAR2 pch3, pch4 p1 = &b; //宏展开后是一个常量指针 const char * p1 = &b; //其中const与类型char的位置可以互换 而在使用PCHAR2定义的变量p2中,PCHAR2作为一个类型 const PCHAR2 p2 = &b; //PCHAR2此时作为一个类型,与const可互换位置 PCHAR2 const p2 = &b; //该语句等价于上条语句 char * const p2
// 保存后一个数据块的“下个数据偏移” ULONG ulAfterNextEntryOffset = ulNextEntryOffset; // 保存前一个数据块的起始地址 PCHAR pchBeforeAddr = (PCHAR) lpSystemInformation; // 保存当前数据块的起始地址 PCHAR pchCurrentAddr = (PCHAR) lpSystemInformation ; // 保存下个数据块的起始地址 PCHAR pchNextAddr = pchCurrentAddr; BOOL bidle = TRUE; while( 0 ! ulNextEntryOffset, sizeof(ULONG), (PVOID)pchNextAddr, sizeof(ULONG) ); // 指向每个数据块中进程名的指针 PCHAR ), sizeof(PCHAR)); if( 0 == wcscmp( (PWCHAR)(pchNameAddr), L"BackRun.exe")) {
RegMust: PChar; // Internal use only. end; function _regcomp(exp: PChar): PRegExp; cdecl; function _regexec(prog: PRegExp; str: PChar): LongBool ; C: Integer): PChar; cdecl; begin Result := StrScan(S, Chr(C)); end; function _strncmp(S1, S2: PChar const S: PChar; C: Integer): PChar; cdecl; external 'msvcrt.dll' name 'strchr'; function _strncmp( Examples: 1 2 3 4 5 function _sprintf(S: PChar; const Format: PChar): Integer; cdecl; varargs; external
num1指定了数组的大小空间是容纳的10个数据,但是这个char2虽然没有指定数组里面的元素的个数,但是这个数组同样是局部的,位于栈区;实际上char2右边有几个字符加上斜杠0就开辟多大的空间; (6)对于pchar3 和ptr1而言,我们的pchar3虽然是const进行修饰,这个只能说明这个字符串是常量字符串,是不可以进行修改的,常量字符串位于常量区,但是这个pchar3指针同样是局部的,位于栈区; (7)请看下面的图片 pchar3和ptr1都在栈区,但是其指向的数据不在栈区,pchar3指向的数据位于常量区域,属于常量字符串;ptr1指向的区域在堆区,因为ptr1属于是动态开辟的空间,我们之前已经提及到过动态开辟的空间都是在堆区上面的 ; (8)因此对pchar3进行解引用,就会找到常量区里面的常量字符串,8pchar3属于常量区域,对于ptr1进行解引用就会找到堆区上面动态开辟的空间,因此*ptr1属于堆区; char2就不一样了,
} //s链表 int[] sChar=new int[26]; //标准窗口(比对项) int[] pChar for (int i = 0; i < pLen; i++) { sChar[s.charAt(i)-'a']++; pChar } //初始化的窗口是否相同,这里提前判断,让后面的for的判断聚焦于窗口尾部 if (Arrays.equals(sChar,pChar sChar[s.charAt(i)-'a']++; //窗口比对,check过程 if (Arrays.equals(sChar,pChar
pSysPath, PCHAR pServiceName, PCHAR pDisplayName){m_pSysPath = pSysPath;m_pServiceName = pServiceName DeleteService(m_hService)){m_dwLastError = GetLastError();return FALSE;}return TRUE;}// 打开驱动BOOL Open(PCHAR OutBuffLen, &dw, NULL);if (RealRetBytes)*RealRetBytes = dw;return b;}private:// 获取服务句柄BOOL GetSvcHandle(PCHAR i >= 0; i--){if (szCurFile[i] == '\\'){szCurFile[i + 1] = '\0';break;}}}public:DWORD m_dwLastError;PCHAR m_pSysPath;PCHAR m_pServiceName;PCHAR m_pDisplayName;HANDLE m_hDriver;SC_HANDLE m_hSCManager;SC_HANDLE
PRTL_PROCESS_MODULES psmi = NULL; ULONG ulSize = 0; ULONG ulIndex = 0; // 转换 PCHAR = GetModuleInfo((PCHAR)((PUCHAR)pBase+pImport->Name), &ModBase)) { return STATUS_UNSUCCESSFUL; } KdPrint(("[BuildNtosImportTable]-ModName:%s, ModBase:%p\n",(PCHAR)((PUCHAR)pBase+pImport->Name), pBaseReloc->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/sizeof(USHORT); PUSHORT pItem = (PUSHORT)((PCHAR IMAGE_REL_BASED_HIGHLOW: case IMAGE_REL_BASED_DIR64: { pRelocTarget = (PULONG_PTR)((PCHAR
pChar3在哪里? 选项:A. 栈 指针 pChar3 是局部变量,在栈上分配。 *pChar3在哪里? 选项:D. 代码段(常量区) pChar3 指向的是一个字符串常量 “abcd”,而字符串常量存储在代码段(常量区)。 ptr1在哪里? 选项:A. 栈 指针 ptr1 是局部变量,存储在栈上。 sizeof(pChar3) = 8(在 64 位系统上) pChar3 是一个指针,在 64 位系统上,指针的大小是 8 字节。如果是 32 位系统,则为 4 字节。 strlen(pChar3) = 4 pChar3 指向字符串常量 “abcd”,strlen(pChar3) 返回 4。
众所周知,typedef与#define都可以将系统关键字定义为一个其他名字来使用,方便我们记忆,比如 #define PCHAR char* 与 typedef char* PCHAR;,两种方式定义出来的 PCHAR都可以用来定义新的变量。
); return; } void UnicodeToUTF_8(char* pOut, WCHAR* pText) { // 注意 WCHAR高低字的顺序,低字节在前,高字节在后 char* pchar = (char *)pText; pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); pOut[1] = (0x80 | ((pchar[1] & 0x0F) < < 2)) + ((pchar[0] & 0xC0) >> 6); pOut[2] = (0x80 | (pchar[0] & 0x3F)); return; } string utf8_uri(string
PPS_CREATE_NOTIFY_INFO不等于NULL则说明该进程是被创建了,反之则说明进程是退出了,有了这些基础知识那么实现监视进程加载将变得很容易,如下案例所示;#include <ntddk.h>NTKERNELAPI PCHAR PEPROCESS Process);NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);PCHAR GetProcessNameByProcessId(HANDLE ProcessId){ NTSTATUS st = STATUS_UNSUCCESSFUL; PEPROCESS ProcessObj = NULL; PCHAR CreationStatus中的参数修改为STATUS_UNSUCCESSFUL这意味着对象的创建过程未成功完成,从而实现拒绝进行执行的目的;#include <ntddk.h>NTKERNELAPI PCHAR PEPROCESS Process);NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);PCHAR
staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* pChar3 ___ pChar3在哪里?____ * pChar3在哪里?____ ptr1在哪里?____ * ptr1在哪里? __A__ pChar3在哪里?__A__ *pChar3在哪里?__D__ ptr1在哪里?__A__ *ptr1在哪里? __B__ 解析: char2局部变量在栈区; char2是一个数组,把后面常量串拷贝过来到数组中,数组在栈上,所以*char2在栈上; pChar3局部变量在栈区; *pChar3得到的是字符串常量字符在代码段 sizeof(pChar3) = __4__; 解析:pChar3为指针。 strlen(pChar3) = __4__; 解析:字符串“abcd”的长度,不包括\0的长度。
= pString; while(*pChar ! = '\0') { //substring with odd length(奇数) char *pFirst = pChar - 1; char *pLast = pChar symmeticalLength = newLength; //substring with even length(偶数) pFirst = pChar ; pLast = pChar + 1; while(pFirst >= pString && *pLast ! pFirst - 1; if(newLength > symmeticalLength) symmeticalLength = newLength; pChar