常用函数库收集

博客给出了几个信息技术相关的代码实现。包括域名解析函数resolv,校验和算法函数checksum,根据窗口句柄获取文件完整路径的函数GetFileNameFromHwnd,以及根据错误ID获取出错信息的函数ErrorTrace,涉及WinAPI的使用。

unsigned long resolv(char*host)

{

     struct hostent             *hp;

     unsigned long              host_ip;

 

     host_ip = inet_addr(host);

     if( host_ip == INADDR_NONE )

     {

         hp = gethostbyname(host);

         if(!hp)

         {

              //printf("/nError: Unable to resolve hostname (%s)/n",host);

              exit(1);

         }

         else

              host_ip = *(u_long*)hp->h_addr ;

     }

 

     return(host_ip);

}

 

 

 

//校验和算法

unsigned short checksum(unsigned short*buffer,int size)

{

     unsigned long cksum=0 ;

     while(size>1)

     {

         cksum+=*buffer++;

         size-=sizeof(unsigned short);

     }

 

     if(size)

         cksum+=*(UCHAR*)buffer ;

     cksum=(cksum>>16)+(cksum&0xffff);

     cksum+=(cksum>>16);

 

     return(unsigned short)(~cksum);

}

 

 

 

//

// 根据窗口句柄取得文件完整路径。

//

//

// 参数:

//      hWnd

//          窗口句柄

//      lpszFileName

//          获取文件完整路径的缓冲区

//      nSize

//          缓冲区长度

//

// 返回值

//      成功返回TRUE, 出错返回FALSE;

//

BOOL GetFileNameFromHwnd(HWND hWnd, LPTSTR lpszFileName, DWORD nSize)

{

     BOOL bResult = FALSE;

     // 从句柄获取进程ID

     DWORD dwProcessId;

     GetWindowThreadProcessId(hWnd , &dwProcessId);

 

     // 获取系统版本信息

     OSVERSIONINFO osverinfo;

     osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

     if ( !GetVersionEx(&osverinfo) )

         return FALSE;

 

     // 当系统为NT核心时

     if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT )

     {

         // 调用PSAPI

         BOOL (WINAPI *lpfEnumProcessModules)

              (HANDLE, HMODULE*, DWORD, LPDWORD);

         DWORD (WINAPI *lpfGetModuleFileNameEx)

              (HANDLE, HMODULE, LPTSTR, DWORD);

 

         // 加载PSAPI.DLL

         HINSTANCE hInstLib = LoadLibrary("PSAPI.DLL");

         if ( hInstLib == NULL )

              return FALSE ;

 

         // 定位相关函数

         lpfEnumProcessModules = (BOOL(WINAPI *)

              (HANDLE, HMODULE *, DWORD, LPDWORD))GetProcAddress(

              hInstLib, "EnumProcessModules");

         lpfGetModuleFileNameEx =(DWORD (WINAPI *)

              (HANDLE, HMODULE, LPTSTR, DWORD))GetProcAddress(

              hInstLib, "GetModuleFileNameExA");

 

         if ( lpfEnumProcessModules && lpfGetModuleFileNameEx )

         {

              // 打开指定进程

              HANDLE hProcess;

              hProcess = OpenProcess(

                   PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,

                   FALSE, dwProcessId);

              if ( hProcess )

              {

                   // 权举模块

                   HMODULE hModule;

                   DWORD dwNeed;

                   if (lpfEnumProcessModules(hProcess,

                       &hModule, sizeof(hModule), &dwNeed))

                   {

                       // 获取文件路径

                       if ( lpfGetModuleFileNameEx(hProcess, hModule,

                            lpszFileName, nSize) )

                            bResult = TRUE;

                   }

                   // 关闭句柄

                   CloseHandle( hProcess ) ;

              }

         }

         // 释放PSAPI.DLL

         FreeLibrary( hInstLib ) ;

     }

     // 当系统为9X

     else if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )

     {

         // 通过ToolHelp

         HANDLE (WINAPI *lpfCreateSnapshot)(DWORD, DWORD);

         BOOL (WINAPI *lpfProcess32First)(HANDLE, LPPROCESSENTRY32);

         BOOL (WINAPI *lpfProcess32Next)(HANDLE, LPPROCESSENTRY32);

 

         // 相关函数的获取

         lpfCreateSnapshot =

              (HANDLE(WINAPI*)(DWORD,DWORD))GetProcAddress(

              GetModuleHandle("kernel32.dll"),

              "CreateToolhelp32Snapshot" );

         lpfProcess32First=

              (BOOL(WINAPI*)(HANDLE,LPPROCESSENTRY32))GetProcAddress(

              GetModuleHandle("kernel32.dll"),

              "Process32First" );

         lpfProcess32Next=

              (BOOL(WINAPI*)(HANDLE,LPPROCESSENTRY32))GetProcAddress(

              GetModuleHandle("kernel32.dll"),

              "Process32Next" );

         if ( !lpfCreateSnapshot ||

              !lpfProcess32First ||

              !lpfProcess32Next)

              return FALSE;

 

         // 利用Toolhelp权举

         HANDLE hSnapshot;

         hSnapshot = lpfCreateSnapshot(TH32CS_SNAPPROCESS , 0);

         if (hSnapshot != (HANDLE)-1)

         {

              // 从第一个开始权举

              PROCESSENTRY32 pe;

              pe.dwSize = sizeof(PROCESSENTRY32);

              if ( lpfProcess32First(hSnapshot, &pe) )

              {

                   do {

                       // 如果是该进程的话取出进程路径

                       if (pe.th32ProcessID == dwProcessId)

                       {

                            lstrcpy(lpszFileName, pe.szExeFile);

                            bResult = TRUE;

                            break;

                       }

                   } while ( lpfProcess32Next(hSnapshot, &pe) );

              }

              // 关闭句柄

              CloseHandle(hSnapshot);

         }

     }

     else

         return FALSE;

 

     return bResult;

}

 

 

 

// 根据错误ID获取出错信息

void ErrorTrace(const char *msg, DWORD error)

{

     DWORD numWritten;

 

     if (error)

     {

         LPTSTR lpMsgBuf;

 

         FormatMessage(

              FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,

              NULL,

              error,

              MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language

              (LPTSTR) &lpMsgBuf,

              0,

              NULL

              );

 

         // Free the buffer.

         LocalFree( lpMsgBuf );

     }

}

 

 

//利用管道获取命令行

bool __fastcall TForm1::RunCmd(AnsiString cmd,TStringList *stringlist)

{

    TMemoryStream *memstream=new TMemoryStream();

    AnsiString rn="//r//n";

    PROCESS_INFORMATION proc;

    STARTUPINFO start;

    SECURITY_ATTRIBUTES sa;

    long ret;

    unsigned long lngBytesread;

    HANDLE hReadPipe,hWritePipe;

    char *strBuff=(char *)malloc(256);

    if(strBuff==NULL)

    {

        return false;

    }

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);

    sa.bInheritHandle=true;

    sa.lpSecurityDescriptor=NULL;

    ret=CreatePipe(&hReadPipe,&hWritePipe,&sa,0);

    if(ret==0)

    {

        //创建管道失败

        return false;

    }

    memset(&start,0x00,sizeof(STARTUPINFO));

    start.cb=sizeof(STARTUPINFO);

    start.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;

    start.hStdOutput=hWritePipe;

    start.hStdError=hWritePipe;

    bool retc=CreateProcess(NULL,cmd.c_str(),NULL,NULL,true, 0, 0, NULL, &start, &proc);

    if(!retc)

    {

        return false;

    }

    CloseHandle(hWritePipe);

    unsigned long len;

    memstream->Position=0;

    while(true)

    {

        memset(strBuff,0x00,256);

        GetFileSize(hReadPipe,&len);

        ret = ReadFile(hReadPipe, strBuff, 256, &lngBytesread,NULL);

        if(ret==0)

        {

            break;

        }

        else

        {

            memstream->Write(strBuff,lngBytesread);

        }

    }

    CloseHandle(proc.hProcess);

    CloseHandle(proc.hThread);

    CloseHandle(hReadPipe);

    memstream->Position=0;

    free(strBuff);

    stringlist->LoadFromStream(memstream);

    memstream->Clear();

    delete memstream;

    return true;

}


//提升进程权限
BOOL EnablePrivilege(LPCTSTR lpSystemName,LPCTSTR lpName)
{
HANDLE hToken ;
BOOL fOk=FALSE ;
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken))
{
TOKEN_PRIVILEGES tp ;
tp.PrivilegeCount=1 ;
if(!LookupPrivilegeValue(lpSystemName,lpName,&tp.Privileges[0].Luid))
printf("Can't lookup privilege value./n");
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED ;
if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL))
printf("Can't adjust privilege value./n");
fOk=(GetLastError()==ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOk ;
}

2004-11-29 7:00 PM | zwell

# 回复:常用函数库收集

//连接指定IP端口,返回socket
int conn(char *ip,int p)
{
int sockfd;
hrm.sin_family = AF_INET;
hrm.sin_addr.s_addr = inet_addr(ip);
hrm.sin_port = htons(p);
bzero(&(hrm.sin_zero),8);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if((connect(sockfd,(struct sockaddr*)&hrm,sizeof(struct sockaddr))) < 0)
{
perror("connect");
exit(0);
}
printf("[x] Connected to: %s on port %d./n",ip,p);
return sockfd;
}
2004-12-03 12:44 AM | ZwelL

# 回复:常用函数库收集

//将指定程序安装成服务
int InstallService(
char *svr_name, char *display_name,char *exepath, int starttype
)
{
SC_HANDLE hService,hSCManager;
hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(hSCManager==NULL) return 0;
hService=CreateService(hSCManager,svr_name,display_name,
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
starttype, //SERVICE_AUTO_START
SERVICE_ERROR_NORMAL, // error control type
exepath, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if(hService==NULL) return 0;
CloseServiceHandle(hService);
return 1;
}

//将指定服务删除
int AUTOLOAD::DeleteServiceByName(char *svr_name)
{
SC_HANDLE hService,hSCManager;
hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(hSCManager==NULL) return 0;
hService=OpenService(hSCManager,svr_name,SERVICE_ALL_ACCESS);
if(hService==NULL) return 0;
if(DeleteService(hService)==0) return 0;
if(CloseServiceHandle(hService)==0) return 0;
return 1;
}
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值