ローディング機能は、ドライバがシステムプロセスで実行するDriverEntry。EPROCESSがPsGetCurrentProcessにより、システムプロセスのカーネル構造体のアドレスを取得することができ、その後、アドレスから「システム」という文字列を探し始めました。見つかったら、EPROCESSプロセス名が保存されてオフセットされています。あなたが直接オフセットEPROCESS構造の後のオフセットに現在のプロセス名を取得することができたときにプロセス名を取得し、プロセスは、ドライブの後に呼び出されます。コードは以下の通りであります:
DWORD GetProcessNameOffset()
{
PEPROCESS curproc;
DWORD procNameOffset;
curproc = PsGetCurrentProcess();
for(int i=0; i< 4096; i++)
{
if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
{
procNameOffset = i;
return procNameOffset;
}
}
return 0;
}
BOOL GetProcessName( PCHAR theName )
{
PEPROCESS curproc;
char *nameptr;
ULONG i;
KIRQL oldirql;
if( gProcessNameOffset )
{
curproc = PsGetCurrentProcess();
nameptr = (PCHAR) curproc + ProcNameOffset;
strncpy( theName, nameptr, NT_PROCNAMELEN );
theName[NT_PROCNAMELEN] = 0; /**//* NULL at end */
return TRUE;
}
return FALSE;
}
AndroidのHAL層、それを使用することができます。
Android.mk 添加
LOCAL_SHARED_LIBRARIES:= \
libbinder
HAL层中.c文件中:
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <hardware/lights.h>
#include <hardware/hardware.h>
#include <hardware/sunxi_display2.h>
#include <cutils/list.h>
#include <stdlib.h>
#include <sys/cdefs.h>
#include <cutils/properties.h>
#include <android/log.h>
#include <binder/IPCThreadState.h>
int fd = 0;
#define GET_CALLING_PID (android::IPCThreadState::self()->getCallingPid())
void getCallingProcessName(char *name)
{
char proc_node[128];
if (name == 0)
{
LOGE("error in params");
return;
}
memset(proc_node, 0, sizeof(proc_node));
sprintf(proc_node, "/proc/%d/cmdline", GET_CALLING_PID);
int fp = ::open(proc_node, O_RDONLY);
if (fp > 0)
{
memset(name, 0, 128);
::read(fp, name, 128);
::close(fp);
fp = 0;
LOGD("Calling process is: %s", name);
}
else
{
LOGE("Obtain calling process failed");
}
}
char mProcessName[128];
getCallingProcessName(mProcessName);
LOGD("openCameraDev calling_process = %s", mProcessName);
対応する処理がlight.cpp HALに上記の手順は、使用logcat -sライトは、いわゆるプロセスを参照する場合は、コールを処理logcatに特に見ることができました。