1.å±å¹åè¯
2.Hibernateå·²ç»è½ä¼äºåï¼
3.详解Linux系统中的白源白代usr目录
å±å¹åè¯
âé¼ æ å±å¹åè¯âææ¯æ¯å¨çµååå ¸ä¸å¾å°å¹¿æ³å°åºç¨çï¼å¦åéå©æ¹åéå±±è¯é¸ç软件ï¼è¿ä¸ªææ¯çä¼¼ç®åï¼å ¶å®å¨WINDOWSç³»ç»ä¸å®ç°å´æ¯é常å¤æçï¼æ»çæ¥è¯´æ两ç§å®ç°æ¹å¼ï¼
第ä¸ç§ï¼éç¨æªè·å¯¹é¨åGDIçAPIè°ç¨æ¥å®ç°,å¦TextOut,TextOutAçã
第äºç§ï¼å¯¹æ¯ä¸ªè®¾å¤ä¸ä¸æ(DC)åä¸åCopy,并è·è¸ªææä¿®æ¹ä¸ä¸æ(DC)çæä½ã
第äºç§æ¹æ³æ´å¼ºå¤§,ä½å ¼å®¹æ§ä¸å¥½ï¼è第ä¸ç§æ¹æ³ä½¿ç¨çæªè·WindowsAPIçè°ç¨ï¼è¿é¡¹ææ¯ç强大å¯è½è¿è¿è¶ åºäºæ¨çæ³è±¡ï¼æ¯«ä¸å¤¸å¼ ç说ï¼å©ç¨WindowsAPIæ¦æªææ¯ï¼ä½ å¯ä»¥æ¹é æ´ä¸ªæä½ç³»ç»ï¼äºå®ä¸å¾å¤å¤æå¼Windowsä¸æå¹³å°å°±æ¯è¿ä¹å®ç°çï¼èè¿é¡¹ææ¯ä¹æ£æ¯è¿ç¯æç« ç主é¢ã
æªWindowsAPIçè°ç¨ï¼å ·ä½ç说æ¥ä¹å¯ä»¥å为两ç§æ¹æ³ï¼
第ä¸ç§æ¹æ³éè¿ç´æ¥æ¹åWinAPI å¨å åä¸çæ åï¼åµå ¥æ±ç¼ä»£ç ï¼ä½¿ä¹è¢«è°ç¨æ¶è·³è½¬å°æå®çå°åè¿è¡æ¥æªè·ï¼ç¬¬äºç§æ¹æ³åæ¹åIATï¼Import Address Table è¾å ¥å°å表ï¼ï¼éå®åWinAPIå½æ°çè°ç¨æ¥å®ç°å¯¹WinAPIçæªè·ã
第ä¸ç§æ¹æ³çå®ç°è¾ä¸ºç¹çï¼èä¸å¨Winãä¸é¢æ´æé¾åº¦ï¼è¿æ¯å 为è½ç¶å¾®è½¯è¯´WINçAPIåªæ¯ä¸ºäºå ¼å®¹æ§æä¿çä¸æ¥ï¼ç¨åºååºè¯¥å°½å¯è½å°è°ç¨ä½çAPI,å®é ä¸æ ¹æ¬å°±ä¸æ¯è¿æ ·ï¼WIN 9Xå é¨ç大é¨åä½APIç»è¿åæ¢è°ç¨äºååçä½APIï¼ä¹å°±æ¯è¯´æ们éè¦å¨æ¦æªçå½æ°ä¸åµå ¥ä½æ±ç¼ä»£ç ï¼
æ们å°è¦ä»ç»çæ¯ç¬¬äºç§æ¦æªæ¹æ³ï¼è¿ç§æ¹æ³å¨WinãåNTä¸é¢è¿è¡é½æ¯è¾ç¨³å®ï¼å ¼å®¹æ§è¾å¥½ãç±äºéè¦ç¨å°å ³äºWindowsèæå åç管çãæç ´è¿ç¨è¾¹çå¢ãååºç¨ç¨åºçè¿ç¨ç©ºé´ä¸æ³¨å ¥ä»£ç ãPEï¼Portable Executableï¼æä»¶æ ¼å¼åIATï¼è¾å ¥å°å表ï¼çè¾åºå±çç¥è¯ï¼æ以æ们å 对æ¶åå°çè¿äºç¥è¯å¤§æ¦å°åä¸ä¸ªä»ç»ï¼æåä¼ç»åºæ¦æªé¨åçå ³é®ä»£ç ã
å 说Windowsèæå åç管çãWindows9Xç»æ¯ä¸ä¸ªè¿ç¨åé äº4GBçå°å空é´ï¼å¯¹äºNTæ¥è¯´ï¼è¿ä¸ªæ°åæ¯2GBï¼ç³»ç»ä¿çäº2GBå° 4GBä¹é´çå°å空é´ç¦æ¢è¿ç¨è®¿é®ï¼èå¨Win9Xä¸ï¼2GBå°4GBè¿é¨åèæå°å空é´å®é ä¸æ¯ç±ææçWINè¿ç¨æå ±äº«çï¼è¿é¨åå°å空é´å è½½äºå ±äº«Win DLLãå åæ å°æ件åVXDãå å管çå¨åæ件系ç»ç ï¼Win9Xä¸è¿é¨å对äºæ¯ä¸ä¸ªè¿ç¨é½æ¯å¯è§çï¼è¿ä¹æ¯Win9Xæä½ç³»ç»ä¸å¤å¥å£®çåå ã
Win9Xä¸ä¸ºä½æä½ç³»ç»ä¿çäº0å°4MBçå°å空é´ï¼èå¨4MBå°2GBä¹é´ä¹å°±æ¯Winè¿ç¨ç§æçå°å空é´ï¼ç±äº æ¯ä¸ªè¿ç¨çå°å空é´é½æ¯ç¸å¯¹ç¬ç«çï¼ä¹å°±æ¯è¯´ï¼å¦æç¨åºæ³æªè·å ¶å®è¿ç¨ä¸çAPIè°ç¨ï¼å°±å¿ é¡»æç ´è¿ç¨è¾¹çå¢ï¼åå ¶å®çè¿ç¨ä¸æ³¨å ¥æªè·APIè°ç¨ç代ç ï¼è¿é¡¹å·¥ä½æ们交ç»é©åå½æ°ï¼SetWindowsHookExï¼æ¥å®æï¼å ³äºå¦ä½å建ä¸ä¸ªå å«ç³»ç»é©åçå¨æé¾æ¥åºï¼ãçµèé«ææå¿ãå·²ç»æè¿ä¸é¢ä»ç»äºï¼è¿éå°±ä¸èµè¿°äºã
ææç³»ç»é©åçå½æ°å¿ é¡»è¦å¨å¨æåºéï¼è¿æ ·çè¯ï¼å½è¿ç¨éå¼ææ¾å¼è°ç¨ä¸ä¸ªå¨æåºéçå½æ°æ¶ï¼ç³»ç»ä¼æè¿ä¸ªå¨æåºæ å°å°è¿ä¸ªè¿ç¨çèæå°å空é´éï¼è¿ä½¿å¾DLLæ为è¿ç¨çä¸é¨åï¼ä»¥è¿ä¸ªè¿ç¨ç身份æ§è¡ï¼ä½¿ç¨è¿ä¸ªè¿ç¨çå æ ï¼ä¹å°±æ¯è¯´å¨æé¾æ¥åºä¸ç代ç 被é©åå½æ°æ³¨å ¥äºå ¶å®GUIè¿ç¨çå°å空é´ï¼éGUIè¿ç¨ï¼é©åå½æ°å°±æ è½ä¸ºåäºï¼ï¼å½å å«é©åçDLLæ³¨å ¥å ¶å®è¿ç¨åï¼å°±å¯ä»¥åå¾æ å°å°è¿ä¸ªè¿ç¨èæå åéçå个模åï¼EXEåDLLï¼çåºå°åï¼å¦ï¼
HMODULE hmodule=GetModuleHandle(âMypro.exeâ);
å¨MFCç¨åºä¸,æ们å¯ä»¥ç¨AfxGetInstanceHandle()å½æ°æ¥å¾å°æ¨¡åçåºå°åãEXEåDLL被æ å°å°èæå å空é´çä»ä¹å°æ¹æ¯ç±å®ä»¬çåºå°åå³å®çãå®ä»¬çåºå°åæ¯å¨é¾æ¥æ¶ç±é¾æ¥å¨å³å®çãå½ä½ æ°å»ºä¸ä¸ªWinå·¥ç¨æ¶ï¼VCï¼ï¼é¾æ¥å¨ä½¿ç¨ç¼ºççåºå°å0xãå¯ä»¥éè¿é¾æ¥å¨çBASEé项æ¹å模åçåºå°åãEXEé常被æ å°å°èæå åç0xå¤ï¼DLLä¹éä¹æä¸åçåºå°åï¼é常被æ å°å°ä¸åè¿ç¨çç¸åçèæå°å空é´å¤ã
ç³»ç»å°EXEåDLLåå°ä¸å¨æ å°å°èæå å空é´ä¸ï¼å®ä»¬å¨å åä¸çç»æä¸ç£çä¸çéææ件ç»ææ¯ä¸æ ·çãå³PE (Portable Executable) æä»¶æ ¼å¼ãæ们å¾å°äºè¿ç¨æ¨¡åçåºå°å以åï¼å°±å¯ä»¥æ ¹æ®PEæ件çæ ¼å¼ç©·ä¸¾è¿ä¸ªæ¨¡åçIMAGE_IMPORT_DESCRIPTORæ°ç»ï¼ççè¿ç¨ç©ºé´ä¸æ¯å¦å¼å ¥äºæ们éè¦æªè·çå½æ°æå¨çå¨æé¾æ¥åºï¼æ¯å¦éè¦æªè·âTextOutAâï¼å°±å¿ é¡»æ£æ¥âGdi.dllâæ¯å¦è¢«å¼å ¥äºã
说å°è¿éï¼æ们æå¿ è¦ä»ç»ä¸ä¸PEæ件çæ ¼å¼ï¼å¦å³å¾ï¼è¿æ¯PEæä»¶æ ¼å¼ç大è´æ¡å¾ï¼æåé¢æ¯æ件头ï¼æ们ä¸å¿ çä¼ï¼ä»PE File Optional Headeråé¢å¼å§ï¼å°±æ¯æ件ä¸å个段ç说æï¼è¯´æåé¢ææ¯çæ£ç段æ°æ®ï¼èå®é ä¸æä»¬å ³å¿çåªæä¸ä¸ªæ®µï¼é£å°±æ¯â.idataâ段ï¼è¿ä¸ªæ®µä¸å å«äºææçå¼å ¥å½æ°ä¿¡æ¯ï¼è¿æIATï¼Import Address Tableï¼çRVAï¼Relative Virtual Addressï¼å°åã
说å°è¿éï¼æªè·WindowsAPIçæ´ä¸ªåçå°±è¦çç¸å¤§ç½äºãå®é ä¸ææè¿ç¨å¯¹ç»å®çAPIå½æ°çè°ç¨æ»æ¯éè¿PEæ件çä¸ä¸ªå°æ¹æ¥è½¬ç§»çï¼è¿å°±æ¯ä¸ä¸ªè¯¥æ¨¡å(å¯ä»¥æ¯EXEæDLL)çâ.idataâ段ä¸çIATè¾å ¥å°å表ï¼Import Address Tableï¼ãå¨é£éææææ¬æ¨¡åè°ç¨çå ¶å®DLLçå½æ°ååå°åãå¯¹å ¶å®DLLçå½æ°è°ç¨å®é ä¸åªæ¯è·³è½¬å°è¾å ¥å°å表ï¼ç±è¾å ¥å°å表å跳转å°DLLçæ£çå½æ°å ¥å£ã
å ·ä½æ¥è¯´ï¼æ们å°éè¿IMAGE_IMPORT_DESCRIPTORæ°ç»æ¥è®¿é®â.idataâ段ä¸å¼å ¥çDLLçä¿¡æ¯ï¼ç¶åéè¿IMAGE_THUNK_DATAæ°ç»æ¥é对ä¸ä¸ªè¢«å¼å ¥çDLL访é®è¯¥DLLä¸è¢«å¼å ¥çæ¯ä¸ªå½æ°çä¿¡æ¯ï¼æ¾å°æ们éè¦æªè·çå½æ°ç跳转å°åï¼ç¶åæ¹ææ们èªå·±çå½æ°çå°åâ¦â¦å ·ä½çåæ³å¨åé¢çå ³é®ä»£ç ä¸ä¼æ详ç»ç讲解ã
讲äºè¿ä¹å¤åçï¼ç°å¨è®©æ们åå°âé¼ æ å±å¹åè¯âçä¸é¢ä¸æ¥ãé¤äºAPIå½æ°çæªè·ï¼è¦å®ç°âé¼ æ å±å¹åè¯âï¼è¿éè¦åä¸äºå ¶å®çå·¥ä½ï¼ç®åç说æ¥ï¼å¯ä»¥æä¸ä¸ªå®æ´çåè¯è¿ç¨å½çº³æ以ä¸å 个æ¥éª¤ï¼
1ï¼ å®è£ é¼ æ é©åï¼éè¿é©åå½æ°è·å¾é¼ æ æ¶æ¯ã
使ç¨å°çAPIå½æ°ï¼SetWindowsHookEx
2ï¼ å¾å°é¼ æ çå½åä½ç½®ï¼åé¼ æ ä¸ççªå£åéç»æ¶æ¯ï¼è®©å®è°ç¨ç³»ç»å½æ°éç»çªå£ã
使ç¨å°çAPIå½æ°ï¼WindowFromPointï¼ScreenToClientï¼InvalidateRect
3ï¼ æªè·å¯¹ç³»ç»å½æ°çè°ç¨ï¼åå¾åæ°ï¼ä¹å°±æ¯æ们è¦åçè¯ã
对äºå¤§å¤æ°çWindowsåºç¨ç¨åºæ¥è¯´ï¼å¦æè¦åè¯ï¼æ们éè¦æªè·çæ¯âGdi.dllâä¸çâTextOutAâå½æ°ã
æ们å ä»¿ç §TextOutAå½æ°åä¸ä¸ªèªå·±çMyTextOutAå½æ°ï¼å¦ï¼
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
// è¿éè¿è¡è¾åºlpszStringçå¤ç
// ç¶åè°ç¨æ£ççTextOutAå½æ°
}
æè¿ä¸ªå½æ°æ¾å¨å®è£ äºé©åçå¨æè¿æ¥åºä¸ï¼ç¶åè°ç¨æ们æåç»åºçHookImportFunctionå½æ°æ¥æªè·è¿ç¨å¯¹TextOutAå½æ°çè°ç¨ï¼è·³è½¬å°æ们çMyTextOutAå½æ°ï¼å®æ对è¾åºå符串çææã
HookImportFunctionçç¨æ³ï¼
HOOKFUNCDESC hd;
PROC pOrigFuns;
hd.szFunc="TextOutA";
hd.pProc=(PROC)MyTextOutA;
HookImportFunction (AfxGetInstanceHandle(),"gdi.dll",&hd,pOrigFuns);
ä¸é¢ç»åºäºHookImportFunctionçæºä»£ç ï¼ç¸ä¿¡è¯¦å°½ç注éä¸å®ä¸ä¼è®©æ¨è§å¾ç解æªè·å°åºæ¯æä¹å®ç°çå¾é¾ï¼Ok,Letâs Goï¼
///////////////////////////////////////////// Begin ///////////////////////////////////////////////////////////////
#include <crtdbg.h>
// è¿éå®ä¹äºä¸ä¸ªäº§çæéçå®
#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))
// å®ä¹äºHOOKFUNCDESCç»æ,æ们ç¨è¿ä¸ªç»æä½ä¸ºåæ°ä¼ ç»HookImportFunctionå½æ°
typedef struct tag_HOOKFUNCDESC
{
LPCSTR szFunc; // The name of the function to hook.
PROC pProc; // The procedure to blast in.
} HOOKFUNCDESC , * LPHOOKFUNCDESC;
// è¿ä¸ªå½æ°çæµå½åç³»ç»æ¯å¦æ¯WindowNT
BOOL IsNT();
// è¿ä¸ªå½æ°å¾å°hModule -- å³æ们éè¦æªè·çå½æ°æå¨çDLL模åçå¼å ¥æ述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule);
// æ们ç主å½æ°
BOOL HookImportFunction(HMODULE hModule, LPCSTR szImportModule,
LPHOOKFUNCDESC paHookFunc, PROC* paOrigFuncs)
{
/////////////////////// ä¸é¢ç代ç æ£æµåæ°çæææ§ ////////////////////////////
_ASSERT(szImportModule);
_ASSERT(!IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC)));
#ifdef _DEBUG
if (paOrigFuncs) _ASSERT(!IsBadWritePtr(paOrigFuncs, sizeof(PROC)));
_ASSERT(paHookFunc.szFunc);
_ASSERT(*paHookFunc.szFunc != '\0');
_ASSERT(!IsBadCodePtr(paHookFunc.pProc));
#endif
if ((szImportModule == NULL) || (IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC))))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return FALSE;
}
//////////////////////////////////////////////////////////////////////////////
// çæµå½å模åæ¯å¦æ¯å¨2GBèæå å空é´ä¹ä¸
// è¿é¨åçå°åå åæ¯å±äºWinè¿ç¨å ±äº«ç
if (!IsNT() && ((DWORD)hModule >= 0x))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_HANDLE, SLE_ERROR);
return FALSE;
}
// æ¸ é¶
if (paOrigFuncs) memset(paOrigFuncs, NULL, sizeof(PROC));
// è°ç¨GetNamedImportDescriptor()å½æ°,æ¥å¾å°hModule -- å³æ们éè¦
// æªè·çå½æ°æå¨çDLL模åçå¼å ¥æ述符(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hModule, szImportModule);
if (pImportDesc == NULL)
return FALSE; // è¥ä¸ºç©º,å模åæªè¢«å½åè¿ç¨æå¼å ¥
// ä»DLL模åä¸å¾å°åå§çTHUNKä¿¡æ¯,å 为pImportDesc->FirstThunkæ°ç»ä¸çåå§ä¿¡æ¯å·²ç»
// å¨åºç¨ç¨åºå¼å ¥è¯¥DLLæ¶è¦çä¸äºææçå¼å ¥ä¿¡æ¯,æ以æ们éè¦éè¿åå¾pImportDesc->OriginalFirstThunk
// æéæ¥è®¿é®å¼å ¥å½æ°åçä¿¡æ¯
PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hModule,
pImportDesc->OriginalFirstThunk);
// ä»pImportDesc->FirstThunkå¾å°IMAGE_THUNK_DATAæ°ç»çæé,ç±äºè¿éå¨DLL被å¼å ¥æ¶å·²ç»å¡«å äº
// ææçå¼å ¥ä¿¡æ¯,æ以çæ£çæªè·å®é ä¸æ£æ¯å¨è¿éè¿è¡ç
PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, pImportDesc->FirstThunk);
// 穷举IMAGE_THUNK_DATAæ°ç»,寻æ¾æ们éè¦æªè·çå½æ°,è¿æ¯æå ³é®çé¨å!
while (pOrigThunk->u1.Function)
{
// åªå¯»æ¾é£äºæå½æ°åèä¸æ¯åºå·å¼å ¥çå½æ°
if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG))
{
// å¾å°å¼å ¥å½æ°çå½æ°å
PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hModule,
pOrigThunk->u1.AddressOfData);
// å¦æå½æ°å以NULLå¼å§,è·³è¿,继ç»ä¸ä¸ä¸ªå½æ°
if ('\0' == pByName->Name[0])
continue;
// bDoHookç¨æ¥æ£æ¥æ¯å¦æªè·æå
BOOL bDoHook = FALSE;
// æ£æ¥æ¯å¦å½åå½æ°æ¯æ们éè¦æªè·çå½æ°
if ((paHookFunc.szFunc[0] == pByName->Name[0]) &&
(strcmpi(paHookFunc.szFunc, (char*)pByName->Name) == 0))
{
// æ¾å°äº!
if (paHookFunc.pProc)
bDoHook = TRUE;
}
if (bDoHook)
{
// æ们已ç»æ¾å°äºæè¦æªè·çå½æ°,é£ä¹å°±å¼å§å¨æå§
// é¦å è¦åçæ¯æ¹åè¿ä¸åèæå åçå åä¿æ¤ç¶æ,让æ们å¯ä»¥èªç±åå
MEMORY_BASIC_INFORMATION mbi_thunk;
VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
PAGE_READWRITE, &mbi_thunk.Protect));
// ä¿åæ们æè¦æªè·çå½æ°çæ£ç¡®è·³è½¬å°å
if (paOrigFuncs)
paOrigFuncs = (PROC)pRealThunk->u1.Function;
// å°IMAGE_THUNK_DATAæ°ç»ä¸çå½æ°è·³è½¬å°åæ¹å为æ们èªå·±çå½æ°å°å!
// 以åææè¿ç¨å¯¹è¿ä¸ªç³»ç»å½æ°çææè°ç¨é½å°æ为对æ们èªå·±ç¼åçå½æ°çè°ç¨
pRealThunk->u1.Function = (PDWORD)paHookFunc.pProc;
// æä½å®æ¯!å°è¿ä¸åèæå åæ¹ååæ¥çä¿æ¤ç¶æ
DWORD dwOldProtect;
_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
mbi_thunk.Protect, &dwOldProtect));
SetLastError(ERROR_SUCCESS);
return TRUE;
}
}
// 访é®IMAGE_THUNK_DATAæ°ç»ä¸çä¸ä¸ä¸ªå ç´
pOrigThunk++;
pRealThunk++;
}
return TRUE;
}
// GetNamedImportDescriptorå½æ°çå®ç°
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule)
{
// æ£æµåæ°
_ASSERT(szImportModule);
_ASSERT(hModule);
if ((szImportModule == NULL) || (hModule == NULL))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}
// å¾å°Dosæ件头
PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule;
// æ£æµæ¯å¦MZæ件头
if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) ||
(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}
// åå¾PEæ件头
PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);
// æ£æµæ¯å¦PEæ åæ件
if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
(pNTHeader->Signature != IMAGE_NT_SIGNATURE))
{
_ASSERT(FALSE);
SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
return NULL;
}
// æ£æ¥PEæ件çå¼å ¥æ®µ(å³ .idata section)
if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
return NULL;
// å¾å°å¼å ¥æ®µ(å³ .idata section)çæé
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader,
pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
// 穷举PIMAGE_IMPORT_DESCRIPTORæ°ç»å¯»æ¾æ们éè¦æªè·çå½æ°æå¨ç模å
while (pImportDesc->Name)
{
PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);
if (stricmp(szCurrMod, szImportModule) == 0)
break; // æ¾å°!ä¸æ循ç¯
// ä¸ä¸ä¸ªå ç´
pImportDesc++;
}
// å¦æ没ææ¾å°,说ææ们寻æ¾ç模å没æ被å½åçè¿ç¨æå¼å ¥!
if (pImportDesc->Name == NULL)
return NULL;
// è¿åå½æ°ææ¾å°ç模åæ述符(import descriptor)
return pImportDesc;
}
// IsNT()å½æ°çå®ç°
BOOL IsNT()
{
OSVERSIONINFO stOSVI;
memset(&stOSVI, NULL, sizeof(OSVERSIONINFO));
stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
BOOL bRet = GetVersionEx(&stOSVI);
_ASSERT(TRUE == bRet);
if (FALSE == bRet) return FALSE;
return (VER_PLATFORM_WIN_NT == stOSVI.dwPlatformId);
}
/////////////////////////////////////////////// End //////////////////////////////////////////////////////////////////////
ä¸ç¥éå¨ä¹åï¼æå¤å°æåå°è¯è¿å»å®ç°âé¼ æ å±å¹åè¯âè¿é¡¹å 满äºææçææ¯ï¼ä¹åªæå°è¯è¿çæåæè½ä½ä¼å°å ¶é´çä¸æï¼å°¤å ¶å¨æ¢ç´¢APIå½æ°çæªè·æ¶ï¼æ头çå ç¯èµæ没æä¸ç¯æ¯æ¶åå°å ³é®ä»£ç çï¼éè¦çå°æ¹é½æ¯ä¸ç¬ä»£è¿ï¼MSDNæ´æ¯æ¾å¾èç½èæ åï¼ä¹ä¸ç¥éé¤äºIMAGE_IMPORT_DESCRIPTORåIMAGE_THUNK_DATAï¼å¾®è½¯è¿éèäºå¤å°ç§å¯ï¼å¥½å¨ç¡¬ç头ç®è¿æ¯æå®ç»æ»å äºï¼å¸æè¿ç¯æç« å¯¹å¤§å®¶è½ææ帮å©ã
Hibernateå·²ç»è½ä¼äºåï¼
ããå¨Javaä¸ç Hibernateæ¯æå¼äººå ³æ³¨çä¸ä¸ªè¯é¢ ä»Gavin Kingå å ¥EJB EG è´è´£å¶è®¢EJB çæä¹ å±è§è å°Gavin Kingéæ£å¼éåºJDO EG 并ä¸å 满个人æ 绪çæ»å»JDO è§è å°ãHibernate in Actionãçåè¡ åå°Hibernate Alphaçåå¸ æååå°æè¿JBoss PRçåå¸ï¼ä½¿ç¨Hibernate å®ç°Entity Beanï¼ å¯ä»¥è¯´è¿å ¶ä¸çæ¯ä¸æ¥é½å¼èµ·ä¸çç侧ç®ããHibernateå¨ä¸å° å¹´çæ¶é´é ä»ä¸ä¸ªä¸èµ·ç¼çå¼æºè½¯ä»¶åå±å°ä»å¤©ä»¤ä¸çç©ç®ç主æµO/R Mappingæ¡æ¶ Gavin Kingä»ä¸ä¸ªå¼æºè½¯ä»¶çä½è æ为ä¸ç举足轻éçäººç© è¿å¤å°æäºä¼ å¥çè²å½© æ¯ç« å纯ä»ææ¯æå°±èè¨ Hibernateä¸ç®æ¯æææå°±çJavaå¼æºæ¡æ¶è½¯ä»¶ å°ç®å为æ¢ä¹ä¸æ¯ä¸ä¸ªå®ç¾æ 缺ç软件 ä»ä¸ªäººææ¯æ°´å¹³èè¨ Gavin Kingä¹ä¸ç®ç»é¡¶é«æ
ããå¨å½åçJavaæä¹ å±æ¡æ¶ä¸ ææµè¡çO/R Mappin *** ååå«æ¯Hibernate JDOåTopLink
ããèªä»å»å¹´Gavin Kingå å ¥JBossä¹å Hibernateå·²ç»ç±ä¸ä¸ªæ°é´çå¼æºè½¯ä»¶èµ°ä¸äºå ¼å®¹EJB EntityBeançéè·¯ ç¶èæ´å 令人侧ç®çæ¯ Gavin Kingå¨EJB EGä¸å å½äºä¸ä¸ªé常éè¦çè§è² åªè¦å¯¹æ¯ä¸ä¸EJB çEntityBeanåHibernate çç¸å°±ä¼å¤§ç½ è½ç¶APIæ¥å£ä¸å ä½æ¯ EntityBeanç设计ç念å®å ¨æ¥èªäºHibernate
ããè½ç¶EJB çEntityBeanå¨ç¸å½ç¨åº¦ä¸æ¥æºäºHibernate ä½æ¯æ¯ç«æ¯ä¸åçAPIæ¥å£ å æ¤HibernateåEJB EntityBean究ç«æ¯ææ ·çä¸ç§å ³ç³» æ¯å¾å¤äººå¿ä¸ççé®
ãã å¹´åæ份JBossçBen Wang访åæé´ ææ¾ç»åBen请æHibernateçæªæ¥åå± ä»åç说 Hibernateæªæ¥å°ä»æ§ä»¥ç¬ç«ç软件产ååå¨ååå± æ¢å¯ä»¥ outside EJB containerä½¿ç¨ åæ¶Hibernateä¹å°å为JBoss EntityBean Implementation åå¯ä»¥inside EJB containerä½¿ç¨ ç¶èå¦ä½æ¢inside åoutside ç»ç©¶ç¼ºä¹ä¸ä¸ªææ§ç认è¯
ãã æ æ¥JBossåå¸ç EJB PRæå¼äºçæ¡ ä»SourcefeçCVSæå¡å¨ä¸é¢checkoutåºæ¥æºä»£ç çä¸ä¸ æ们å¯ä»¥åç° Gavin King对Hibernate è¿è¡äºç®åçå°è£ å°EJB EntityBean APIè°ç¨è½¬æ¢ä¸ºå é¨Hibernate èªå·±çAPI ä»èå®ç°EJB EntityBeançå ¼å®¹
ããEJB ä¸æ¿è¯ºè±ç¦»å®¹å¨è°ç¨ å¦æä½ æ³äº«ç¨EJB åå¿ é¡»è¿è¡å¨æ个EJB Vendoræä¾ç容å¨å ä¾å¦ä½ 使ç¨JBossæä¾çå®¹å¨ é£ä¹ä½ è°ç¨çæ¯EntityBean API è¿äºè°ç¨è¯·æ±ä¼è¢«è½¬æ¢ä¸ºHibernate APIçè°ç¨è¯·æ± è¿æå³çHibernateå®é ä¸æä¾äºä¸¤å¥API ä¸å¥æ¯HibernateåçAPI å¦ä¸å¥æ¯å ¼å®¹EJB EntityBean API 对äºé£äºéè¦åå¸å¼è°ç¨æ¯æ éè¦EJB容å¨çå¼å人åæ¥è¯´ ä»ä»¬éæ©åä¸å¥API 对äºä¸éè¦EJB容å¨çå¼å人åæ¥è¯´ ä»ä»¬éæ©åä¸å¥ API è¿å°±æ¯Hibernateæ¢å®çåå±çç¥
ããä»å¹´å¤å¤©æ票éè¿çJDO æ åä»æç§ç¨åº¦èè¨ å¹¶ä¸éè²äº Hibernateå½åççæ¬ æäºåè½çè³æ¯Hibernateè¿è¦å¥½ ä¾å¦ JDOæ¯æ对类å±æ§çlazy loading èHibernateè¦å° ææ¯æ å½åHibernateä» ä» æ¯æç±»çlazy loading å®é ä¸å¨å»å¹´ 就已ç»æå¾å¤ç¨æ·ä¸ææåºå¯¹ç±»å±æ§çlazy loadingçéæ± ç¶èGavin Kingå½æ¶ä¸ç´ä¸è®¤ä¸ºè¿ä¸ªéæ±ææ·»å çå¿ è¦æ§ åä¾å¦è¢«Gavin King形容为 å¯æç JDOQL å®é ä¸æ¯ç±»SQLæ¥è¯¢è¯è¨å对象æ¡ä»¶æ¥è¯¢çæ··åä½ ä»åè½ä¸æ¥è¯´ ä¸å¦HQL强大 ä½æ¯æ¯Hibernateèªå·±çæ¡ä»¶æ¥è¯¢å¼º
ããä¸ç¥é究ç«åºäºä»ä¹åå Gavin King对JDOä¼¼ä¹ä¸ç´ææç±è¡·çåæ¶ æ ä»å¨Hibernateçblogä¸é¢å¯¹JDOè¿è¡äºæ¯«ä¸çæ çæ¹å¤ å举äºJDOçç§ç§ç¼ºç¹æ¥è§£é为ä»ä¹EJB æä¹ å±è§è没ææJDOèèè¿å» ç¶èäºå®ä¸ä»çæ¹å¤å 满äºå¯¹JDOç误解ååè§ ä¾å¦Gavin Kingææ¨JDOQLä¸æ¯«æ²¡æä»ä¹ç¹å«ççç± åªå 为JDOQLä¸æ¯ä¸ä¸ªçº¯ç²¹çæ¥è¯¢è¯è¨ èæ¯ä¸ä¸ªæ··åä½ è¿å¤å°è®©äººå¯¹Gavin Kingçé£åº¦æå°éæ¾ å¨è¢«SolarmetricçAbe Whiteå驳ä¹å åæ ·æ²¡æé£åº¦ç说 æå¯æ²¡ææ¶é´åè¿ç§æ è°çäºè®º äºå®ä¸æ¯ä¸ªäººé½è®¤ä¸ºä»èªå·±çææ¯æ¯æ好çâ¦â¦ææ¯éäº JDOé£ä¼äººä¹éäº æ¯ä¸ªäººé½ä¼ç¯é误â¦â¦ ï¼æ以说人æ å®äººï¼ï¼
ããJDO è§èçåºå°äºå®ä¸ææäºå¯¹Hibernate ä¹è³åºäº Hibernateç念çEJB EntityBeanç严éå¨è JDO è§èå¨åè½ä¸ç严é缺失导è´äºJDOæ åé¢å¯¹HibernateåTopLinkçç«äº ç¶èåè½åºæ¬å®å¤çJDO æä¼å¤JDO Vendoråä¸æ¯æçåå åæ¶JDOè§èå¯ä»¥é¿å 产åéå®å¨æ个Vendorçä¼å¿ å·²ç»å°ç«äºç天平æç´
ãã
ããç¶èJDO åEJB 两大åä¸ä¸»æµæ åçåè£ æ¯å¤§é¨å人 çè³å æ¬ååæä¸å¸æçå°ç äºæ¯æç»EJB çLead Linda DeMichielåJDO çLead Craig Russellèååè¡¨å ¬å¼ä¿¡ 宣å¸äºä¸ä¸ªå并EJB åJDO æä¹ å±è§èç计å æ°çæä¹ å±è§èå°ä»¥JSR ï¼EJB ï¼çæä¹ å±è§è为åºç¡ èåJDO çé¨åç¹æ§ æ°çæä¹ å±è§èå°è¿å ¥J EE ä¹ä¸ ç¬ç«äºEJBåå¨ æ¢å¯ä»¥inside J EE容å¨æ¥ä½¿ç¨ ä¹å¯ä»¥è±ç¦»J EEå®¹å¨ ç¬ç«çè¿è¡
ããè¿ä¸ªæ°çæä¹ å±æ¡æ¶å¯ä»¥è¯´å®å ¨æ¯ä¸ä¸ªæ¿æ²»çäº§ç© EJB Vendorsåºäºèªèº«å©çå对JDO 使å¾JDO没æåæ³æ为J EEçä¸é¨å ç¶èæ åçåè£ä¹æ¯å¤§é¨å人æ´å ä¸å¸æçå°ç äºæ¯æç»JDOæäºæ¿æ²»æäºççºç²å ä»è¡¨é¢ä¸æ¥ç JDOåEJB EntityBeané½å°è¢«æ°çæä¹ å±æ¡æ¶å代 ä¼¼ä¹JDO并没æåäº ä½å®é ä¸JDO æ åå·²ç»æç é¨åJDOé¢å¯¼ååç产åå·²ç»èå§å¾ å è EJB EntityBeanè¿å¤äºEarly Draft çå¾ äº§åè¯çè³å°ä¹æ¯ä¸å¹´ä¹åçäºæ äº å¦å¤å¼å¾è人寻å³çæ¯ æ°çæä¹ å±æ¡æ¶å°åºäºå½åEJB EntityBean åç»åJDO çè§è 并ä¸å°å¤äºEJB EGçæ§å¶ä¹ä¸ åå å ¥ä¸äºJDO EGçæå å æ¤å¯ä»¥çåºæ¥æ°çæä¹ å±æ¡æ¶æ çè¿æ¯ä»¥EJB EG为主导è¿è¡å¶å®ç
ããä»é¿è¿æ¥ç EJB åJDO çæ¿æ²»æäºå¯¹åæ¹é½æå¥½å¤ é¿æåè£å¸¦æ¥çåæ对åæ¹çåå±é½ä¸å© ç¶èä»çææ¥ç JDO ç¡®å®æ¯å¨è¿åºæ¿æ²»æäºä¸è´¥ä¸éµæ¥ æç´æ¥çä½ç°å°±æ¯ å·²ç»æä¸äºJDOçç¨æ·å¯¹JDOçåæ¯äº§çäºå¨æåè¿·è« ä¸å°çJDOç±å¥½è æ´æ¯ç´è¨JDOå°æ»
ããTopLinkæ¯ä¸ä¸ªèçç O/R Mappingè½¯ä»¶äº èªä»è¢«Oracleæ¶è´ä¹å åå¢å äºå¯¹Oracleæ°æ®åºçè¯å¥½æ¯æ å对Oracle AS EntityBeançæ¯æ Oracleæä¾äºTopLinkçå¾å½¢è®¾è®¡ç¯å¢ å¯ä»¥ä½¿å¾è®¾è®¡å¥½çTopLinkå模åæ¢å¯ä»¥è¢«åç¬ç¨å¨TopLink ä¸ ä¹å¯ä»¥è¢«ç¨å¨EJB CMPä¸ å æ¤çæ¥TopLinkä¹èµ°äºä¸æ¡åHibernateåæ ·çç¥çè·¯
ããTopLinkçé®é¢å¨äºç¸æ¯Hibernateçå¼æºåå è´¹çä¼å¿æ¥è¯´ TopLinkæ¢ä¸å¼æº å®ä»·åä¸è²ä¸ æ¬æ¥åä¸è½¯ä»¶TopLinkåºè¯¥å¨ææ¯æ¯æååä¸å®£ä¼ çç¥ä¸æ¥æ足å¤çä¼å¿ ç¶èOracleå ¬å¸æ¯ç«æ¯ä¸ä¸ªä»¥æ°æ®åºä¸ºæ ¸å¿äº§åçå ¬å¸ å ¶ä»çä¸å产åé½æ¯ä¸ºäºæ°æ®åºéå®ä¸ç»©èæå¡ç å¨Oracle产å线ä¸å¤äºä¸ä¸ªä»å±å°ä½çTopLink ç±äºå 天ä¸è¶³ åªè½ç¼ççççHibernateçæ¥ç壮大èæ æä½ä¸º å æ¤ TopLinkæ´å¤ç被å±éå¨è´ä¹°äºOracleæ°æ®åº 并ä¸ç»å®Oracleæ°æ®åºçç¨æ·ç¾¤ä½ä¸
ããJ EE çæ°æä¹ å±è§èå°æ¯«æ æ¬å¿µçæ为æªæ¥æä¹ å±æ¡æ¶ç主æµAPI æ 论æ¯Hibernate JDO è¿æ¯TopLinkç»å°å ¼å®¹è¿ä¸ªä¸»æµåä¸API å¨å½åçè¿ä¸ç§æä¹ å±APIå½ä¸ Hibernateæ çæ¯ææåéç è¿æ¯å 为 æ°çæä¹ å±è§èå°åºäºEJB EntityBeanè§è è¿æå³çä»å°ä»¥Hibernateç设计ç念为åºç¡
ãã JBoss对EJB è§èè·éçæ¥ä¼éå¸¸ç´§å¯ å¨è§èå¶å®è¿ç¨ä¸å°±ä¸æçåå¸åèå®ç°äº§å å æ¤å¯ä»¥å¯¹å¯¹EJB è§è产çæ¯è¾å¤§çå½±åå
ãã综ä¸æè¿° æ们æçç±å¯¹Hibernateçåéæ±æ强ççä¿¡å¿
ããæåçä¸ä¸ªçé®æ¯ æ¢ç¶J EE çæ°æä¹ å±æ¡æ¶å¯ä»¥è±ç¦»J EE容å¨è¿è¡ é£ä¹å¤§å®¶ä¸å ¨é¨é½å»ç¨Hibernateçåä¸å¥å ¼å®¹API èå®å ¨æ¾å¼HibernateçåçAPIäºåï¼é£ä¹æ¯å¦æå³çHibernateå为ä¸ä¸ªç¬ç«äº§åç使å½å½»åºç»ç»å¢ï¼
ãã对äºè¿ä¸ªé®é¢æççæ³æ¯ J EE çæä¹ å±è§èè¦ç»¼åå个EJB Vendor JDO Vendorçæè§ è¦å¹³è¡¡ä»ä»¬ä¹é´çå©çå¾å¤± é£ä¹è¿æ ·ä¸ä¸ªç»å顾åçè§èå¿ ç¶æ æ³è¦çææåºç¨åºåçå ¨é¢éè¦ è¿ä¸åHibernateçåçAPI å¯ä»¥éæ¶æ ¹æ®å¼å人åçè¦æ±å¢å åè½é£ä¹çµæ´» å æ¤æé¢è®¡HibernateçåçAPIä»¥å ¶æ´å 强大çåè½ä»ç¶ä¼å¸å¼ä¸å¤§æ¹äººç´æ¥ä½¿ç¨åçAPI èä¸æ¯å ¼å®¹J EEè§èçAPI
lishixinzhi/Article/program/Java/ky//详解Linux系统中的usr目录
linux 文件结构中,有一个很神奇的码大码目录 —— /usr。之前一直没有怎么关注过它,白源白代反正程序都是码大码安装在里边的,也没有什么值得追根溯源的白源白代东西。直到有一天 fedora 要简化整个文件系统体系,码大码javascript 高级程序设计 源码看到讨论才想到,白源白代usr 到底是码大码什么的缩写呢,它又是白源白代怎么来的呢?讨论中,大部分观点认为:
1.usr 是码大码 unix system resources 的缩写;
2.usr 是 user 的缩写;
3.usr 是 unix software resources 的缩写。
根据常识判断,白源白代是码大码 user 缩写的可能性不大,因为和 /home 冲突了嘛。白源白代不过是码大码 system resources 还是 software resources 的缩写还真不好说。特此查了好多东西,白源白代却发现竟然连 wikipedia 也模棱两可。/usr 是linux系统核心所在,包含了所有的共享文件。
它是 unix 系统中最重要的目录之一,涵盖了二进制文件,各种文档,表白神器成品+源码各种头文件,x,还有各种库文件;还有诸多程序,例如 ftp,telnet 等等。
曾经的 /usr 还是用户的家目录,存放着各种用户文件 —— 现在已经被 /home 取代了(例如 /usr/someone 已经改为 /home/someone)。
现代的 /usr 只专门存放各种程序和数据,用户目录已经转移。虽然 /usr 名称未改,交流互动平台+源码不过其含义已经从“用户目录”变成了“unix 系统资源”目录。值得注意的是,在一些 unix 系统上,仍然把 /usr/someone 当做用户家目录,如 Minix。
/usr 文件系统经常很大,因为所有程序安装在这里. /usr 里的所有文件一般来自Linux distribution;本地安装的程序和其他东西在/usr/local 下.这样可能在升级新版系统或新distribution时无须重新安装全部程序.
由于/usr中的文件不和特定的计算机相关,也不会在通常使用中修改,因此可以通过网络共享这个目录(文件系统),这样,游戏源码怎么用_当管理员安装了新的软件之后,所有共享这一文件系统的计算机均可以使用新的软件。
至此,真相大白。看来就像前一阵子的 /var/run 移到 /run 一样。
真的是不看不知道,一看吓一跳呀。原来 linux 几经进化,好多目录的诞生和用途已经产生了根本的变化。
/usr 目录结构
/usr/bin : 所有可执行文件,素材vip解析源码如 gcc,firefox 等(指不包含在 /sbin 和 /bin 内的);
/usr/include : 各种头文件,编译文件等时需要使用;
/usr/include/”package-name” : 程序特定的头文件;
/usr/lib : 所以可执行文件所需要的库文件;
/usr/local : 这里主要存放那些手动安装的软件,即 不是通过“新立得”或apt-get安装的软件 。 它和/usr目录具有相类似的目录结构 。让软件包管理器来管理/usr目录,而把自定义的 脚本 (scripts)放到/usr/local目录下面,我想这应该是个不错的主意。
/usr/XR6 : x 系统的二进制文件,库文件,文档,字体等。它不等同于 /usr 的作用,只有 x 才能调用这些库文件等,其他程序不读取或者使用。因为 linux 没有原生图形界面,而且 linux 大部分情况下是 for server 的,所以图形界面没有意义;其中 XR6 代表 version release 6;
/usr/XR6/bin : x 的二进制文件,包含运行 x 的必须文件;
/usr/XR6/include : x 相关的头文件;
/usr/XR6/lib : x 库文件;
/usr/XR6/lib/modules : x 的模块,启动时加载。缺少 video4linux, DRI and GLX 和 输入输出设备 模块,将工作不正常;
/usr/XR6/lib/X/fonts : x font server 的字体文件;
/usr/doc : 文档。实际是 /usr/share/doc 的软链接;
/usr/etc : 一个极少用到的配置文件存放地;
/usr/games : 曾经包含游戏等文件,现在很少用到;
/usr/info : 系统相关信息,是 /usr/share/info 的软链接;
/usr/man : man 手册,已经移至 /usr/share/man;
/usr/sbin : 类似 /sbin,root 可以执行。但此目录不包含在环境变量 $PATH 中,它包含的程序类似于 chroot, useradd, in.tftpd and pppconfig;
/usr/share : 它包含了各种程序间的共享文件,如字体,图标,文档等。(/usr/local 对应的目录是 /usr/loca/share);
/usr/share/doc : 类似应用程序的 man 手册。它包含程序的说明文件,默认配置文件等;
/usr/share/info : 不常用,已经被 man 代替;
/usr/share/man : app 的 manual;
/usr/share/icons : 应用程序的图标等文件,分为 png,svg 等多种格式;
/usr/share/fonts : 字体文件,系统范围内可使用,~/.fonts 仅当前用户可用;
/usr/src : linux 内核的源码和说明文档等;
/usr/src/linux : linux 源代码;
/usr/src/linux/.config : 内核编译过程产生的文件;通常由命令 “make config” , “make menuconfig” 或 “make xconfig” 执行后产生;
/usr/src/linux/.depend, /usr/src/linux/.hdepend : “make dep” 检测编译依赖时需要的文件,由 /usr/src/linux/.config 产生;
/usr/src/linux/COPYING : GNU license;
/usr/src/linux/Makefile : 编译内核所需的 Makefile;
/usr/src/linux/Rules.make : 当有多个 Makefile 时,根据它的规则执行 make;
/usr/tmp : 已经被众多发行版抛弃的临时文件夹。