描述:
先看现象,还是先批判它?
先批判它:简单的说就是故意设置技术障碍,让你陷在里面,然后它的技术就领先了!
所以,对付它的方法就是在了解它60~80%的基础上抛弃它!
再看现象,代码说明问题:
...
// 一个被动态植入的DLL
BOOL CWorkerApp::InitInstance()
{
TCHAR pszLoader[MAX_PATH];
::GetModuleFileName(NULL, pszLoader, MAX_PATH);
CString strLoader = pszLoader;
strLoader.MakeLower();
_Module.Init(ObjectMap, m_hInstance, &LIBID_WORKERLib);
DisableThreadLibraryCalls(m_hInstance);
if (m_hMutexOnly1 == NULL)
return FALSE;
if (strLoader.Find(_T("regsvr32.exe")) == -1 &&
strLoader.Find(_T("rundll32.exe")) == -1)
{
::CreateThread(NULL, 0, DaemonProc, this, 0, &m_dwThreadID);
}
return TRUE;//CWinApp::InitInstance();
}
DWORD WINAPI CWorkerApp::DaemonProc(LPVOID lpParam)
{
//CoInitializeEx(NULL,COINIT_MULTITHREADED);
CoInitialize(NULL);
CWorkerApp* pThis = (CWorkerApp*)lpParam;
// IAgentEx是一个ATL的COM接口
IAgentEx* pBA = NULL;
HRESULT hr = CoCreateInstance(
CLSID_AgentEx,
NULL,
CLSCTX_INPROC_SERVER,
IID_IAgentEx,
(void**)&pBA);
if (FAILED(hr))//这里是成功的
{
}
pBA->Release();//但是这里为什么不是成功的,打倒MicoSoft从这里开始
CoUninitialize();
pThis->m_dwThreadID = 0;
return 0;
}
...
// CAgentEx
class ATL_NO_VTABLE CAgentEx :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CAgentEx, &CLSID_AgentEx>,
public IDispatchImpl<IAgentEx, &IID_IAgentEx, &LIBID_WORKERLib>
{
public:
CAgentEx();
DECLARE_REGISTRY_RESOURCEID(IDR_AGENTEX)
DECLARE_NOT_AGGREGATABLE(CAgentEx)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CAgentEx)
COM_INTERFACE_ENTRY(IAgentEx)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
END_COM_MAP()
HRESULT FinalConstruct()
{
return CoCreateFreeThreadedMarshaler(
GetControllingUnknown(), &m_pUnkMarshaler.p);
}
void FinalRelease()
{
m_pUnkMarshaler.Release();
}
CComPtr<IUnknown> m_pUnkMarshaler;
// IAgentEx
public:
STDMETHOD(Detach)();
STDMETHOD(Attach)(HWND hWndIE, HWND hWndLog);
// IDispatch
public:
STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*,
VARIANT*, EXCEPINFO*, UINT*);
private:
BOOL m_bInit;
CCriticalSection m_csDo;
};
为什么Release()就出错,找了很多原因,都不通,只好骂骂MicoSoft,
然后来请教高手们!