/*++ Copyright (c) 1999 Microsoft Corporation Module Name: vs_types.hxx Abstract: General thunking class. Author: Adi Oltean [aoltean] 01/11/2002 Revision History: Name Date Comments aoltean 01/11/2002 Created Description: A thunk is a very thin wrapper around a COM object. This wrapper intercepts all calls and delegates them to teh original object. You generally cannot tell the difference between a thunked COM object and a non-thunked one. The thunk intercepts all the QueryInterface/AddRef/Release calls and traces detalied information (like reference counts). For example, an AddRef to a thunked object will be translated into an AddRef call to the managed (original) COM object. Thunking is done internally at COM interface level. However, since QueryInterface is intercepted. a thunk is automatically created for every new interface pointer. Since the IUnknown pointer for a COM object must be the same for its entire lifetime, the QueryInterface implementation will return the same IUnknown thunk each time, therefore maintaining COM semantics of QueryInterface. Usage: // Attach a thunk to the managed (original object) // The thunk object is created with an initial reference count == 1 // The managed object will remain with the SAME reference count! hr = CVssQIThunk::CreateNewThunk(pManagedItf, L"ObjectName", // for debugging only IID_IYourInterface, // The initial interface for your thunk (IUnknown**)&pThunked interface); // Thunked interface Example: // vs_cmxml.cxx #include "vs_thunk.hxx" // ---------- Original code --------------------- CComPtr pWriter; ft.CoCreateInstanceWithLog( VSSDBG_XML, CLSID_VssEvent, L"VSSEvent", CLSCTX_ALL, IID_IVssWriter, (IUnknown**)&(pWriter)); ft.CheckForError(VSSDBG_XML, L"CoCreateInstance"); // ---------- Code with the added thunk --------------------- // Create the pWriterManagedItf instance CComPtr pWriterManagedItf; ft.CoCreateInstanceWithLog( VSSDBG_XML, CLSID_VssEvent, L"VSSEvent", CLSCTX_ALL, IID_IVssWriter, (IUnknown**)&(pWriterManagedItf)); ft.CheckForError(VSSDBG_XML, L"CoCreateInstance"); // Setup the thunking interface CComPtr pWriter; ft.hr = CVssQIThunk::CreateNewThunk(pWriterManagedItf, L"WriterBC", IID_IVssWriter, (IUnknown**)&pWriter); ft.CheckForError( VSSDBG_COORD, L"CreateNewThunk(writersBC)"); // Detach the original COM interface pWriterManagedItf.Detach(); // ------------------------------------------------------- Remark: In teh example above, we assume that we want to "final release" the managed interface when the final release of the thunk interface is being called. (this assumption holds only if you attach the thunk to an object which has the reference cout = 1 at the moment of attach). However, it is not necesary to have the same reference count for the thunk and for the managed interface. You may want to enforce this restriction only if you want minimal changes in the existing code. --*/ #pragma once //////////////////////////////////////////////////////////////////////// // Standard foo for file name aliasing. This code block must be after // all includes of VSS header files. // #ifdef VSS_FILE_ALIAS #undef VSS_FILE_ALIAS #endif #define VSS_FILE_ALIAS "INCTHUNH" // //////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // The QueryInterface thunk (used for refcount debugging purposes) // Maximum length for the object name class CVssQIThunk: public IUnknown { // Data members private: // Managed object // This has to be the first member (4 bytes) IUnknown* m_pManagedInterface; // Internal reference count (for life management) // This has to be the second member (4 bytes) LONG m_cInternalRefCount; // Interface ID IID m_iid; // Object name (for debugging) CVssAutoPWSZ m_aszObjectName; // Interface name (for debugging) CVssAutoPWSZ m_aszInterfaceName; // Thunk ID (for debugging purposes) // (note that an object can have many thunks) LONG m_ThunkID; // TRUE if this instance was added to the map. bool m_bIsAddedToTheMap; // Static members private: // ID for the last returned thunk static volatile LONG m_NewestThunkID; // Map of IUnknown for thunked identities // Key: the IUnknown identity of the managed interface // Value: the thunk for the managed identity interface. // - An entry is added in this array whenever a thunked obkect is created for the // identity IUnknown // - This will guarantee identity closure over thunked objects. static CVssSimpleMap m_mapIdentities; // Lock around the map static CVssSafeCriticalSection m_csMapCriticalSection; // Constructors/destructors private: // fake constructors/operations (never called) CVssQIThunk(const CVssQIThunk&); CVssQIThunk& operator=(const CVssQIThunk&); // Standard constructor CVssQIThunk( IN IUnknown* pManagedInterface, IN const IID& iid, IN LPCWSTR wszObjectName ); public: // Public static constructor static HRESULT CreateNewThunk( IN IUnknown* pManagedUnknown, IN LPCWSTR wszObjectName, IN const IID& iid, OUT IUnknown** pp ); CVssQIThunk() {}; ~CVssQIThunk(); // Attributes public: bool IsValid() { return (GetObjectName() && GetInterfaceName()); }; LPWSTR GetObjectName() { return m_aszObjectName; }; LPWSTR GetInterfaceName() { return m_aszInterfaceName; }; LONG GetThunkID() { return m_ThunkID; }; bool IsIdentity() { return !!(m_iid == IID_IUnknown); }; bool IsAddedToTheMap() { return m_bIsAddedToTheMap; }; void MarkAsAddedToTheMap() { m_bIsAddedToTheMap = true; }; // Private operations private: // Lookup for this identity in the global identity table static CVssQIThunk* LookupForIdentity( IN IUnknown* pManagedItf ); // Add this identity in the global identity table static bool AddIdentity( IN IUnknown* pManagedItf, IN CVssQIThunk* pThunk ); // Remove this identity from the global identity table static void RemoveIdentity( IN IUnknown* pManagedItf ); // Provides the lock for operating with the global identity table CVssSafeCriticalSection& GetCS() { return m_csMapCriticalSection; }; // Reuse this identity void ReuseIdentity(); static void GetInterfaceNameFromRegistry( IN REFIID iid, OUT CVssAutoPWSZ & aszInterfaceName ); // Ovverides public: STDMETHOD(QueryInterface)(REFIID iid, void** pp); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); STDMETHOD(f3)(); STDMETHOD(f4)(); STDMETHOD(f5)(); STDMETHOD(f6)(); STDMETHOD(f7)(); STDMETHOD(f8)(); STDMETHOD(f9)(); STDMETHOD(f10)(); STDMETHOD(f11)(); STDMETHOD(f12)(); STDMETHOD(f13)(); STDMETHOD(f14)(); STDMETHOD(f15)(); STDMETHOD(f16)(); STDMETHOD(f17)(); STDMETHOD(f18)(); STDMETHOD(f19)(); STDMETHOD(f20)(); STDMETHOD(f21)(); STDMETHOD(f22)(); STDMETHOD(f23)(); STDMETHOD(f24)(); STDMETHOD(f25)(); STDMETHOD(f26)(); STDMETHOD(f27)(); STDMETHOD(f28)(); STDMETHOD(f29)(); STDMETHOD(f30)(); STDMETHOD(f31)(); STDMETHOD(f32)(); STDMETHOD(f33)(); STDMETHOD(f34)(); STDMETHOD(f35)(); STDMETHOD(f36)(); STDMETHOD(f37)(); STDMETHOD(f38)(); STDMETHOD(f39)(); STDMETHOD(f40)(); STDMETHOD(f41)(); STDMETHOD(f42)(); STDMETHOD(f43)(); STDMETHOD(f44)(); STDMETHOD(f45)(); STDMETHOD(f46)(); STDMETHOD(f47)(); STDMETHOD(f48)(); STDMETHOD(f49)(); STDMETHOD(f50)(); STDMETHOD(f51)(); STDMETHOD(f52)(); STDMETHOD(f53)(); STDMETHOD(f54)(); STDMETHOD(f55)(); STDMETHOD(f56)(); STDMETHOD(f57)(); STDMETHOD(f58)(); STDMETHOD(f59)(); STDMETHOD(f60)(); STDMETHOD(f61)(); STDMETHOD(f62)(); STDMETHOD(f63)(); STDMETHOD(f64)(); STDMETHOD(f65)(); STDMETHOD(f66)(); STDMETHOD(f67)(); STDMETHOD(f68)(); STDMETHOD(f69)(); STDMETHOD(f70)(); STDMETHOD(f71)(); STDMETHOD(f72)(); STDMETHOD(f73)(); STDMETHOD(f74)(); STDMETHOD(f75)(); STDMETHOD(f76)(); STDMETHOD(f77)(); STDMETHOD(f78)(); STDMETHOD(f79)(); STDMETHOD(f80)(); STDMETHOD(f81)(); STDMETHOD(f82)(); STDMETHOD(f83)(); STDMETHOD(f84)(); STDMETHOD(f85)(); STDMETHOD(f86)(); STDMETHOD(f87)(); STDMETHOD(f88)(); STDMETHOD(f89)(); STDMETHOD(f90)(); STDMETHOD(f91)(); STDMETHOD(f92)(); STDMETHOD(f93)(); STDMETHOD(f94)(); STDMETHOD(f95)(); STDMETHOD(f96)(); STDMETHOD(f97)(); STDMETHOD(f98)(); STDMETHOD(f99)(); STDMETHOD(f100)(); STDMETHOD(f101)(); STDMETHOD(f102)(); STDMETHOD(f103)(); STDMETHOD(f104)(); STDMETHOD(f105)(); STDMETHOD(f106)(); STDMETHOD(f107)(); STDMETHOD(f108)(); STDMETHOD(f109)(); STDMETHOD(f110)(); STDMETHOD(f111)(); STDMETHOD(f112)(); STDMETHOD(f113)(); STDMETHOD(f114)(); STDMETHOD(f115)(); STDMETHOD(f116)(); STDMETHOD(f117)(); STDMETHOD(f118)(); STDMETHOD(f119)(); STDMETHOD(f120)(); STDMETHOD(f121)(); STDMETHOD(f122)(); STDMETHOD(f123)(); STDMETHOD(f124)(); STDMETHOD(f125)(); STDMETHOD(f126)(); STDMETHOD(f127)(); STDMETHOD(f128)(); STDMETHOD(f129)(); STDMETHOD(f130)(); STDMETHOD(f131)(); STDMETHOD(f132)(); STDMETHOD(f133)(); STDMETHOD(f134)(); STDMETHOD(f135)(); STDMETHOD(f136)(); STDMETHOD(f137)(); STDMETHOD(f138)(); STDMETHOD(f139)(); STDMETHOD(f140)(); STDMETHOD(f141)(); STDMETHOD(f142)(); STDMETHOD(f143)(); STDMETHOD(f144)(); STDMETHOD(f145)(); STDMETHOD(f146)(); STDMETHOD(f147)(); STDMETHOD(f148)(); STDMETHOD(f149)(); STDMETHOD(f150)(); STDMETHOD(f151)(); STDMETHOD(f152)(); STDMETHOD(f153)(); STDMETHOD(f154)(); STDMETHOD(f155)(); STDMETHOD(f156)(); STDMETHOD(f157)(); STDMETHOD(f158)(); STDMETHOD(f159)(); STDMETHOD(f160)(); STDMETHOD(f161)(); STDMETHOD(f162)(); STDMETHOD(f163)(); STDMETHOD(f164)(); STDMETHOD(f165)(); STDMETHOD(f166)(); STDMETHOD(f167)(); STDMETHOD(f168)(); STDMETHOD(f169)(); STDMETHOD(f170)(); STDMETHOD(f171)(); STDMETHOD(f172)(); STDMETHOD(f173)(); STDMETHOD(f174)(); STDMETHOD(f175)(); STDMETHOD(f176)(); STDMETHOD(f177)(); STDMETHOD(f178)(); STDMETHOD(f179)(); STDMETHOD(f180)(); STDMETHOD(f181)(); STDMETHOD(f182)(); STDMETHOD(f183)(); STDMETHOD(f184)(); STDMETHOD(f185)(); STDMETHOD(f186)(); STDMETHOD(f187)(); STDMETHOD(f188)(); STDMETHOD(f189)(); STDMETHOD(f190)(); STDMETHOD(f191)(); STDMETHOD(f192)(); STDMETHOD(f193)(); STDMETHOD(f194)(); STDMETHOD(f195)(); STDMETHOD(f196)(); STDMETHOD(f197)(); STDMETHOD(f198)(); STDMETHOD(f199)(); STDMETHOD(f200)(); STDMETHOD(f201)(); STDMETHOD(f202)(); STDMETHOD(f203)(); STDMETHOD(f204)(); STDMETHOD(f205)(); STDMETHOD(f206)(); STDMETHOD(f207)(); STDMETHOD(f208)(); STDMETHOD(f209)(); STDMETHOD(f210)(); STDMETHOD(f211)(); STDMETHOD(f212)(); STDMETHOD(f213)(); STDMETHOD(f214)(); STDMETHOD(f215)(); STDMETHOD(f216)(); STDMETHOD(f217)(); STDMETHOD(f218)(); STDMETHOD(f219)(); STDMETHOD(f220)(); STDMETHOD(f221)(); STDMETHOD(f222)(); STDMETHOD(f223)(); STDMETHOD(f224)(); STDMETHOD(f225)(); STDMETHOD(f226)(); STDMETHOD(f227)(); STDMETHOD(f228)(); STDMETHOD(f229)(); STDMETHOD(f230)(); STDMETHOD(f231)(); STDMETHOD(f232)(); STDMETHOD(f233)(); STDMETHOD(f234)(); STDMETHOD(f235)(); STDMETHOD(f236)(); STDMETHOD(f237)(); STDMETHOD(f238)(); STDMETHOD(f239)(); STDMETHOD(f240)(); STDMETHOD(f241)(); STDMETHOD(f242)(); STDMETHOD(f243)(); STDMETHOD(f244)(); STDMETHOD(f245)(); STDMETHOD(f246)(); STDMETHOD(f247)(); STDMETHOD(f248)(); STDMETHOD(f249)(); STDMETHOD(f250)(); STDMETHOD(f251)(); STDMETHOD(f252)(); STDMETHOD(f253)(); STDMETHOD(f254)(); STDMETHOD(f255)(); STDMETHOD(f256)(); STDMETHOD(f257)(); STDMETHOD(f258)(); STDMETHOD(f259)(); STDMETHOD(f260)(); STDMETHOD(f261)(); STDMETHOD(f262)(); STDMETHOD(f263)(); STDMETHOD(f264)(); STDMETHOD(f265)(); STDMETHOD(f266)(); STDMETHOD(f267)(); STDMETHOD(f268)(); STDMETHOD(f269)(); STDMETHOD(f270)(); STDMETHOD(f271)(); STDMETHOD(f272)(); STDMETHOD(f273)(); STDMETHOD(f274)(); STDMETHOD(f275)(); STDMETHOD(f276)(); STDMETHOD(f277)(); STDMETHOD(f278)(); STDMETHOD(f279)(); STDMETHOD(f280)(); STDMETHOD(f281)(); STDMETHOD(f282)(); STDMETHOD(f283)(); STDMETHOD(f284)(); STDMETHOD(f285)(); STDMETHOD(f286)(); STDMETHOD(f287)(); STDMETHOD(f288)(); STDMETHOD(f289)(); STDMETHOD(f290)(); STDMETHOD(f291)(); STDMETHOD(f292)(); STDMETHOD(f293)(); STDMETHOD(f294)(); STDMETHOD(f295)(); STDMETHOD(f296)(); STDMETHOD(f297)(); STDMETHOD(f298)(); STDMETHOD(f299)(); STDMETHOD(f300)(); STDMETHOD(f301)(); STDMETHOD(f302)(); STDMETHOD(f303)(); STDMETHOD(f304)(); STDMETHOD(f305)(); STDMETHOD(f306)(); STDMETHOD(f307)(); STDMETHOD(f308)(); STDMETHOD(f309)(); STDMETHOD(f310)(); STDMETHOD(f311)(); STDMETHOD(f312)(); STDMETHOD(f313)(); STDMETHOD(f314)(); STDMETHOD(f315)(); STDMETHOD(f316)(); STDMETHOD(f317)(); STDMETHOD(f318)(); STDMETHOD(f319)(); STDMETHOD(f320)(); STDMETHOD(f321)(); STDMETHOD(f322)(); STDMETHOD(f323)(); STDMETHOD(f324)(); STDMETHOD(f325)(); STDMETHOD(f326)(); STDMETHOD(f327)(); STDMETHOD(f328)(); STDMETHOD(f329)(); STDMETHOD(f330)(); STDMETHOD(f331)(); STDMETHOD(f332)(); STDMETHOD(f333)(); STDMETHOD(f334)(); STDMETHOD(f335)(); STDMETHOD(f336)(); STDMETHOD(f337)(); STDMETHOD(f338)(); STDMETHOD(f339)(); STDMETHOD(f340)(); STDMETHOD(f341)(); STDMETHOD(f342)(); STDMETHOD(f343)(); STDMETHOD(f344)(); STDMETHOD(f345)(); STDMETHOD(f346)(); STDMETHOD(f347)(); STDMETHOD(f348)(); STDMETHOD(f349)(); STDMETHOD(f350)(); STDMETHOD(f351)(); STDMETHOD(f352)(); STDMETHOD(f353)(); STDMETHOD(f354)(); STDMETHOD(f355)(); STDMETHOD(f356)(); STDMETHOD(f357)(); STDMETHOD(f358)(); STDMETHOD(f359)(); STDMETHOD(f360)(); STDMETHOD(f361)(); STDMETHOD(f362)(); STDMETHOD(f363)(); STDMETHOD(f364)(); STDMETHOD(f365)(); STDMETHOD(f366)(); STDMETHOD(f367)(); STDMETHOD(f368)(); STDMETHOD(f369)(); STDMETHOD(f370)(); STDMETHOD(f371)(); STDMETHOD(f372)(); STDMETHOD(f373)(); STDMETHOD(f374)(); STDMETHOD(f375)(); STDMETHOD(f376)(); STDMETHOD(f377)(); STDMETHOD(f378)(); STDMETHOD(f379)(); STDMETHOD(f380)(); STDMETHOD(f381)(); STDMETHOD(f382)(); STDMETHOD(f383)(); STDMETHOD(f384)(); STDMETHOD(f385)(); STDMETHOD(f386)(); STDMETHOD(f387)(); STDMETHOD(f388)(); STDMETHOD(f389)(); STDMETHOD(f390)(); STDMETHOD(f391)(); STDMETHOD(f392)(); STDMETHOD(f393)(); STDMETHOD(f394)(); STDMETHOD(f395)(); STDMETHOD(f396)(); STDMETHOD(f397)(); STDMETHOD(f398)(); STDMETHOD(f399)(); STDMETHOD(f400)(); STDMETHOD(f401)(); STDMETHOD(f402)(); STDMETHOD(f403)(); STDMETHOD(f404)(); STDMETHOD(f405)(); STDMETHOD(f406)(); STDMETHOD(f407)(); STDMETHOD(f408)(); STDMETHOD(f409)(); STDMETHOD(f410)(); STDMETHOD(f411)(); STDMETHOD(f412)(); STDMETHOD(f413)(); STDMETHOD(f414)(); STDMETHOD(f415)(); STDMETHOD(f416)(); STDMETHOD(f417)(); STDMETHOD(f418)(); STDMETHOD(f419)(); STDMETHOD(f420)(); STDMETHOD(f421)(); STDMETHOD(f422)(); STDMETHOD(f423)(); STDMETHOD(f424)(); STDMETHOD(f425)(); STDMETHOD(f426)(); STDMETHOD(f427)(); STDMETHOD(f428)(); STDMETHOD(f429)(); STDMETHOD(f430)(); STDMETHOD(f431)(); STDMETHOD(f432)(); STDMETHOD(f433)(); STDMETHOD(f434)(); STDMETHOD(f435)(); STDMETHOD(f436)(); STDMETHOD(f437)(); STDMETHOD(f438)(); STDMETHOD(f439)(); STDMETHOD(f440)(); STDMETHOD(f441)(); STDMETHOD(f442)(); STDMETHOD(f443)(); STDMETHOD(f444)(); STDMETHOD(f445)(); STDMETHOD(f446)(); STDMETHOD(f447)(); STDMETHOD(f448)(); STDMETHOD(f449)(); STDMETHOD(f450)(); STDMETHOD(f451)(); STDMETHOD(f452)(); STDMETHOD(f453)(); STDMETHOD(f454)(); STDMETHOD(f455)(); STDMETHOD(f456)(); STDMETHOD(f457)(); STDMETHOD(f458)(); STDMETHOD(f459)(); STDMETHOD(f460)(); STDMETHOD(f461)(); STDMETHOD(f462)(); STDMETHOD(f463)(); STDMETHOD(f464)(); STDMETHOD(f465)(); STDMETHOD(f466)(); STDMETHOD(f467)(); STDMETHOD(f468)(); STDMETHOD(f469)(); STDMETHOD(f470)(); STDMETHOD(f471)(); STDMETHOD(f472)(); STDMETHOD(f473)(); STDMETHOD(f474)(); STDMETHOD(f475)(); STDMETHOD(f476)(); STDMETHOD(f477)(); STDMETHOD(f478)(); STDMETHOD(f479)(); STDMETHOD(f480)(); STDMETHOD(f481)(); STDMETHOD(f482)(); STDMETHOD(f483)(); STDMETHOD(f484)(); STDMETHOD(f485)(); STDMETHOD(f486)(); STDMETHOD(f487)(); STDMETHOD(f488)(); STDMETHOD(f489)(); STDMETHOD(f490)(); STDMETHOD(f491)(); STDMETHOD(f492)(); STDMETHOD(f493)(); STDMETHOD(f494)(); STDMETHOD(f495)(); STDMETHOD(f496)(); STDMETHOD(f497)(); STDMETHOD(f498)(); STDMETHOD(f499)(); STDMETHOD(f500)(); STDMETHOD(f501)(); STDMETHOD(f502)(); STDMETHOD(f503)(); STDMETHOD(f504)(); STDMETHOD(f505)(); STDMETHOD(f506)(); STDMETHOD(f507)(); STDMETHOD(f508)(); STDMETHOD(f509)(); STDMETHOD(f510)(); STDMETHOD(f511)(); STDMETHOD(f512)(); STDMETHOD(f513)(); STDMETHOD(f514)(); STDMETHOD(f515)(); STDMETHOD(f516)(); STDMETHOD(f517)(); STDMETHOD(f518)(); STDMETHOD(f519)(); STDMETHOD(f520)(); STDMETHOD(f521)(); STDMETHOD(f522)(); STDMETHOD(f523)(); STDMETHOD(f524)(); STDMETHOD(f525)(); STDMETHOD(f526)(); STDMETHOD(f527)(); STDMETHOD(f528)(); STDMETHOD(f529)(); STDMETHOD(f530)(); STDMETHOD(f531)(); STDMETHOD(f532)(); STDMETHOD(f533)(); STDMETHOD(f534)(); STDMETHOD(f535)(); STDMETHOD(f536)(); STDMETHOD(f537)(); STDMETHOD(f538)(); STDMETHOD(f539)(); STDMETHOD(f540)(); STDMETHOD(f541)(); STDMETHOD(f542)(); STDMETHOD(f543)(); STDMETHOD(f544)(); STDMETHOD(f545)(); STDMETHOD(f546)(); STDMETHOD(f547)(); STDMETHOD(f548)(); STDMETHOD(f549)(); STDMETHOD(f550)(); STDMETHOD(f551)(); STDMETHOD(f552)(); STDMETHOD(f553)(); STDMETHOD(f554)(); STDMETHOD(f555)(); STDMETHOD(f556)(); STDMETHOD(f557)(); STDMETHOD(f558)(); STDMETHOD(f559)(); STDMETHOD(f560)(); STDMETHOD(f561)(); STDMETHOD(f562)(); STDMETHOD(f563)(); STDMETHOD(f564)(); STDMETHOD(f565)(); STDMETHOD(f566)(); STDMETHOD(f567)(); STDMETHOD(f568)(); STDMETHOD(f569)(); STDMETHOD(f570)(); STDMETHOD(f571)(); STDMETHOD(f572)(); STDMETHOD(f573)(); STDMETHOD(f574)(); STDMETHOD(f575)(); STDMETHOD(f576)(); STDMETHOD(f577)(); STDMETHOD(f578)(); STDMETHOD(f579)(); STDMETHOD(f580)(); STDMETHOD(f581)(); STDMETHOD(f582)(); STDMETHOD(f583)(); STDMETHOD(f584)(); STDMETHOD(f585)(); STDMETHOD(f586)(); STDMETHOD(f587)(); STDMETHOD(f588)(); STDMETHOD(f589)(); STDMETHOD(f590)(); STDMETHOD(f591)(); STDMETHOD(f592)(); STDMETHOD(f593)(); STDMETHOD(f594)(); STDMETHOD(f595)(); STDMETHOD(f596)(); STDMETHOD(f597)(); STDMETHOD(f598)(); STDMETHOD(f599)(); STDMETHOD(f600)(); STDMETHOD(f601)(); STDMETHOD(f602)(); STDMETHOD(f603)(); STDMETHOD(f604)(); STDMETHOD(f605)(); STDMETHOD(f606)(); STDMETHOD(f607)(); STDMETHOD(f608)(); STDMETHOD(f609)(); STDMETHOD(f610)(); STDMETHOD(f611)(); STDMETHOD(f612)(); STDMETHOD(f613)(); STDMETHOD(f614)(); STDMETHOD(f615)(); STDMETHOD(f616)(); STDMETHOD(f617)(); STDMETHOD(f618)(); STDMETHOD(f619)(); STDMETHOD(f620)(); STDMETHOD(f621)(); STDMETHOD(f622)(); STDMETHOD(f623)(); STDMETHOD(f624)(); STDMETHOD(f625)(); STDMETHOD(f626)(); STDMETHOD(f627)(); STDMETHOD(f628)(); STDMETHOD(f629)(); STDMETHOD(f630)(); STDMETHOD(f631)(); STDMETHOD(f632)(); STDMETHOD(f633)(); STDMETHOD(f634)(); STDMETHOD(f635)(); STDMETHOD(f636)(); STDMETHOD(f637)(); STDMETHOD(f638)(); STDMETHOD(f639)(); STDMETHOD(f640)(); STDMETHOD(f641)(); STDMETHOD(f642)(); STDMETHOD(f643)(); STDMETHOD(f644)(); STDMETHOD(f645)(); STDMETHOD(f646)(); STDMETHOD(f647)(); STDMETHOD(f648)(); STDMETHOD(f649)(); STDMETHOD(f650)(); STDMETHOD(f651)(); STDMETHOD(f652)(); STDMETHOD(f653)(); STDMETHOD(f654)(); STDMETHOD(f655)(); STDMETHOD(f656)(); STDMETHOD(f657)(); STDMETHOD(f658)(); STDMETHOD(f659)(); STDMETHOD(f660)(); STDMETHOD(f661)(); STDMETHOD(f662)(); STDMETHOD(f663)(); STDMETHOD(f664)(); STDMETHOD(f665)(); STDMETHOD(f666)(); STDMETHOD(f667)(); STDMETHOD(f668)(); STDMETHOD(f669)(); STDMETHOD(f670)(); STDMETHOD(f671)(); STDMETHOD(f672)(); STDMETHOD(f673)(); STDMETHOD(f674)(); STDMETHOD(f675)(); STDMETHOD(f676)(); STDMETHOD(f677)(); STDMETHOD(f678)(); STDMETHOD(f679)(); STDMETHOD(f680)(); STDMETHOD(f681)(); STDMETHOD(f682)(); STDMETHOD(f683)(); STDMETHOD(f684)(); STDMETHOD(f685)(); STDMETHOD(f686)(); STDMETHOD(f687)(); STDMETHOD(f688)(); STDMETHOD(f689)(); STDMETHOD(f690)(); STDMETHOD(f691)(); STDMETHOD(f692)(); STDMETHOD(f693)(); STDMETHOD(f694)(); STDMETHOD(f695)(); STDMETHOD(f696)(); STDMETHOD(f697)(); STDMETHOD(f698)(); STDMETHOD(f699)(); STDMETHOD(f700)(); STDMETHOD(f701)(); STDMETHOD(f702)(); STDMETHOD(f703)(); STDMETHOD(f704)(); STDMETHOD(f705)(); STDMETHOD(f706)(); STDMETHOD(f707)(); STDMETHOD(f708)(); STDMETHOD(f709)(); STDMETHOD(f710)(); STDMETHOD(f711)(); STDMETHOD(f712)(); STDMETHOD(f713)(); STDMETHOD(f714)(); STDMETHOD(f715)(); STDMETHOD(f716)(); STDMETHOD(f717)(); STDMETHOD(f718)(); STDMETHOD(f719)(); STDMETHOD(f720)(); STDMETHOD(f721)(); STDMETHOD(f722)(); STDMETHOD(f723)(); STDMETHOD(f724)(); STDMETHOD(f725)(); STDMETHOD(f726)(); STDMETHOD(f727)(); STDMETHOD(f728)(); STDMETHOD(f729)(); STDMETHOD(f730)(); STDMETHOD(f731)(); STDMETHOD(f732)(); STDMETHOD(f733)(); STDMETHOD(f734)(); STDMETHOD(f735)(); STDMETHOD(f736)(); STDMETHOD(f737)(); STDMETHOD(f738)(); STDMETHOD(f739)(); STDMETHOD(f740)(); STDMETHOD(f741)(); STDMETHOD(f742)(); STDMETHOD(f743)(); STDMETHOD(f744)(); STDMETHOD(f745)(); STDMETHOD(f746)(); STDMETHOD(f747)(); STDMETHOD(f748)(); STDMETHOD(f749)(); STDMETHOD(f750)(); STDMETHOD(f751)(); STDMETHOD(f752)(); STDMETHOD(f753)(); STDMETHOD(f754)(); STDMETHOD(f755)(); STDMETHOD(f756)(); STDMETHOD(f757)(); STDMETHOD(f758)(); STDMETHOD(f759)(); STDMETHOD(f760)(); STDMETHOD(f761)(); STDMETHOD(f762)(); STDMETHOD(f763)(); STDMETHOD(f764)(); STDMETHOD(f765)(); STDMETHOD(f766)(); STDMETHOD(f767)(); STDMETHOD(f768)(); STDMETHOD(f769)(); STDMETHOD(f770)(); STDMETHOD(f771)(); STDMETHOD(f772)(); STDMETHOD(f773)(); STDMETHOD(f774)(); STDMETHOD(f775)(); STDMETHOD(f776)(); STDMETHOD(f777)(); STDMETHOD(f778)(); STDMETHOD(f779)(); STDMETHOD(f780)(); STDMETHOD(f781)(); STDMETHOD(f782)(); STDMETHOD(f783)(); STDMETHOD(f784)(); STDMETHOD(f785)(); STDMETHOD(f786)(); STDMETHOD(f787)(); STDMETHOD(f788)(); STDMETHOD(f789)(); STDMETHOD(f790)(); STDMETHOD(f791)(); STDMETHOD(f792)(); STDMETHOD(f793)(); STDMETHOD(f794)(); STDMETHOD(f795)(); STDMETHOD(f796)(); STDMETHOD(f797)(); STDMETHOD(f798)(); STDMETHOD(f799)(); STDMETHOD(f800)(); STDMETHOD(f801)(); STDMETHOD(f802)(); STDMETHOD(f803)(); STDMETHOD(f804)(); STDMETHOD(f805)(); STDMETHOD(f806)(); STDMETHOD(f807)(); STDMETHOD(f808)(); STDMETHOD(f809)(); STDMETHOD(f810)(); STDMETHOD(f811)(); STDMETHOD(f812)(); STDMETHOD(f813)(); STDMETHOD(f814)(); STDMETHOD(f815)(); STDMETHOD(f816)(); STDMETHOD(f817)(); STDMETHOD(f818)(); STDMETHOD(f819)(); STDMETHOD(f820)(); STDMETHOD(f821)(); STDMETHOD(f822)(); STDMETHOD(f823)(); STDMETHOD(f824)(); STDMETHOD(f825)(); STDMETHOD(f826)(); STDMETHOD(f827)(); STDMETHOD(f828)(); STDMETHOD(f829)(); STDMETHOD(f830)(); STDMETHOD(f831)(); STDMETHOD(f832)(); STDMETHOD(f833)(); STDMETHOD(f834)(); STDMETHOD(f835)(); STDMETHOD(f836)(); STDMETHOD(f837)(); STDMETHOD(f838)(); STDMETHOD(f839)(); STDMETHOD(f840)(); STDMETHOD(f841)(); STDMETHOD(f842)(); STDMETHOD(f843)(); STDMETHOD(f844)(); STDMETHOD(f845)(); STDMETHOD(f846)(); STDMETHOD(f847)(); STDMETHOD(f848)(); STDMETHOD(f849)(); STDMETHOD(f850)(); STDMETHOD(f851)(); STDMETHOD(f852)(); STDMETHOD(f853)(); STDMETHOD(f854)(); STDMETHOD(f855)(); STDMETHOD(f856)(); STDMETHOD(f857)(); STDMETHOD(f858)(); STDMETHOD(f859)(); STDMETHOD(f860)(); STDMETHOD(f861)(); STDMETHOD(f862)(); STDMETHOD(f863)(); STDMETHOD(f864)(); STDMETHOD(f865)(); STDMETHOD(f866)(); STDMETHOD(f867)(); STDMETHOD(f868)(); STDMETHOD(f869)(); STDMETHOD(f870)(); STDMETHOD(f871)(); STDMETHOD(f872)(); STDMETHOD(f873)(); STDMETHOD(f874)(); STDMETHOD(f875)(); STDMETHOD(f876)(); STDMETHOD(f877)(); STDMETHOD(f878)(); STDMETHOD(f879)(); STDMETHOD(f880)(); STDMETHOD(f881)(); STDMETHOD(f882)(); STDMETHOD(f883)(); STDMETHOD(f884)(); STDMETHOD(f885)(); STDMETHOD(f886)(); STDMETHOD(f887)(); STDMETHOD(f888)(); STDMETHOD(f889)(); STDMETHOD(f890)(); STDMETHOD(f891)(); STDMETHOD(f892)(); STDMETHOD(f893)(); STDMETHOD(f894)(); STDMETHOD(f895)(); STDMETHOD(f896)(); STDMETHOD(f897)(); STDMETHOD(f898)(); STDMETHOD(f899)(); STDMETHOD(f900)(); STDMETHOD(f901)(); STDMETHOD(f902)(); STDMETHOD(f903)(); STDMETHOD(f904)(); STDMETHOD(f905)(); STDMETHOD(f906)(); STDMETHOD(f907)(); STDMETHOD(f908)(); STDMETHOD(f909)(); STDMETHOD(f910)(); STDMETHOD(f911)(); STDMETHOD(f912)(); STDMETHOD(f913)(); STDMETHOD(f914)(); STDMETHOD(f915)(); STDMETHOD(f916)(); STDMETHOD(f917)(); STDMETHOD(f918)(); STDMETHOD(f919)(); STDMETHOD(f920)(); STDMETHOD(f921)(); STDMETHOD(f922)(); STDMETHOD(f923)(); STDMETHOD(f924)(); STDMETHOD(f925)(); STDMETHOD(f926)(); STDMETHOD(f927)(); STDMETHOD(f928)(); STDMETHOD(f929)(); STDMETHOD(f930)(); STDMETHOD(f931)(); STDMETHOD(f932)(); STDMETHOD(f933)(); STDMETHOD(f934)(); STDMETHOD(f935)(); STDMETHOD(f936)(); STDMETHOD(f937)(); STDMETHOD(f938)(); STDMETHOD(f939)(); STDMETHOD(f940)(); STDMETHOD(f941)(); STDMETHOD(f942)(); STDMETHOD(f943)(); STDMETHOD(f944)(); STDMETHOD(f945)(); STDMETHOD(f946)(); STDMETHOD(f947)(); STDMETHOD(f948)(); STDMETHOD(f949)(); STDMETHOD(f950)(); STDMETHOD(f951)(); STDMETHOD(f952)(); STDMETHOD(f953)(); STDMETHOD(f954)(); STDMETHOD(f955)(); STDMETHOD(f956)(); STDMETHOD(f957)(); STDMETHOD(f958)(); STDMETHOD(f959)(); STDMETHOD(f960)(); STDMETHOD(f961)(); STDMETHOD(f962)(); STDMETHOD(f963)(); STDMETHOD(f964)(); STDMETHOD(f965)(); STDMETHOD(f966)(); STDMETHOD(f967)(); STDMETHOD(f968)(); STDMETHOD(f969)(); STDMETHOD(f970)(); STDMETHOD(f971)(); STDMETHOD(f972)(); STDMETHOD(f973)(); STDMETHOD(f974)(); STDMETHOD(f975)(); STDMETHOD(f976)(); STDMETHOD(f977)(); STDMETHOD(f978)(); STDMETHOD(f979)(); STDMETHOD(f980)(); STDMETHOD(f981)(); STDMETHOD(f982)(); STDMETHOD(f983)(); STDMETHOD(f984)(); STDMETHOD(f985)(); STDMETHOD(f986)(); STDMETHOD(f987)(); STDMETHOD(f988)(); STDMETHOD(f989)(); STDMETHOD(f990)(); STDMETHOD(f991)(); STDMETHOD(f992)(); STDMETHOD(f993)(); STDMETHOD(f994)(); STDMETHOD(f995)(); STDMETHOD(f996)(); STDMETHOD(f997)(); STDMETHOD(f998)(); STDMETHOD(f999)(); STDMETHOD(f1000)(); STDMETHOD(f1001)(); STDMETHOD(f1002)(); STDMETHOD(f1003)(); STDMETHOD(f1004)(); STDMETHOD(f1005)(); STDMETHOD(f1006)(); STDMETHOD(f1007)(); STDMETHOD(f1008)(); STDMETHOD(f1009)(); STDMETHOD(f1010)(); STDMETHOD(f1011)(); STDMETHOD(f1012)(); STDMETHOD(f1013)(); STDMETHOD(f1014)(); STDMETHOD(f1015)(); STDMETHOD(f1016)(); STDMETHOD(f1017)(); STDMETHOD(f1018)(); STDMETHOD(f1019)(); STDMETHOD(f1020)(); STDMETHOD(f1021)(); STDMETHOD(f1022)(); STDMETHOD(f1023)(); #ifndef _WIN64 STDMETHOD(f1024)(); #endif }; //////////////////////////////////////////////////////////////////////// // Thunk implementations inline static void VssBadThunkCall() { BS_ASSERT(false); } #ifdef _M_IX86 #define IMPL_THUNK(n)\ __declspec(naked) inline HRESULT CVssQIThunk::f##n()\ {\ __asm mov eax, [esp+4]\ __asm cmp dword ptr [eax+8], 0\ __asm jg goodref\ __asm call VssBadThunkCall\ __asm goodref:\ __asm mov eax, [esp+4]\ __asm mov eax, dword ptr [eax+4]\ __asm mov [esp+4], eax\ __asm mov eax, dword ptr [eax]\ __asm mov eax, dword ptr [eax+4*n]\ __asm jmp eax\ } #else #define IMPL_THUNK(x) inline HRESULT CVssQIThunk::f##n()\ {\ return E_NOTIMPL;\ } #endif IMPL_THUNK(3) IMPL_THUNK(4) IMPL_THUNK(5) IMPL_THUNK(6) IMPL_THUNK(7) IMPL_THUNK(8) IMPL_THUNK(9) IMPL_THUNK(10) IMPL_THUNK(11) IMPL_THUNK(12) IMPL_THUNK(13) IMPL_THUNK(14) IMPL_THUNK(15) IMPL_THUNK(16) IMPL_THUNK(17) IMPL_THUNK(18) IMPL_THUNK(19) IMPL_THUNK(20) IMPL_THUNK(21) IMPL_THUNK(22) IMPL_THUNK(23) IMPL_THUNK(24) IMPL_THUNK(25) IMPL_THUNK(26) IMPL_THUNK(27) IMPL_THUNK(28) IMPL_THUNK(29) IMPL_THUNK(30) IMPL_THUNK(31) IMPL_THUNK(32) IMPL_THUNK(33) IMPL_THUNK(34) IMPL_THUNK(35) IMPL_THUNK(36) IMPL_THUNK(37) IMPL_THUNK(38) IMPL_THUNK(39) IMPL_THUNK(40) IMPL_THUNK(41) IMPL_THUNK(42) IMPL_THUNK(43) IMPL_THUNK(44) IMPL_THUNK(45) IMPL_THUNK(46) IMPL_THUNK(47) IMPL_THUNK(48) IMPL_THUNK(49) IMPL_THUNK(50) IMPL_THUNK(51) IMPL_THUNK(52) IMPL_THUNK(53) IMPL_THUNK(54) IMPL_THUNK(55) IMPL_THUNK(56) IMPL_THUNK(57) IMPL_THUNK(58) IMPL_THUNK(59) IMPL_THUNK(60) IMPL_THUNK(61) IMPL_THUNK(62) IMPL_THUNK(63) IMPL_THUNK(64) IMPL_THUNK(65) IMPL_THUNK(66) IMPL_THUNK(67) IMPL_THUNK(68) IMPL_THUNK(69) IMPL_THUNK(70) IMPL_THUNK(71) IMPL_THUNK(72) IMPL_THUNK(73) IMPL_THUNK(74) IMPL_THUNK(75) IMPL_THUNK(76) IMPL_THUNK(77) IMPL_THUNK(78) IMPL_THUNK(79) IMPL_THUNK(80) IMPL_THUNK(81) IMPL_THUNK(82) IMPL_THUNK(83) IMPL_THUNK(84) IMPL_THUNK(85) IMPL_THUNK(86) IMPL_THUNK(87) IMPL_THUNK(88) IMPL_THUNK(89) IMPL_THUNK(90) IMPL_THUNK(91) IMPL_THUNK(92) IMPL_THUNK(93) IMPL_THUNK(94) IMPL_THUNK(95) IMPL_THUNK(96) IMPL_THUNK(97) IMPL_THUNK(98) IMPL_THUNK(99) IMPL_THUNK(100) IMPL_THUNK(101) IMPL_THUNK(102) IMPL_THUNK(103) IMPL_THUNK(104) IMPL_THUNK(105) IMPL_THUNK(106) IMPL_THUNK(107) IMPL_THUNK(108) IMPL_THUNK(109) IMPL_THUNK(110) IMPL_THUNK(111) IMPL_THUNK(112) IMPL_THUNK(113) IMPL_THUNK(114) IMPL_THUNK(115) IMPL_THUNK(116) IMPL_THUNK(117) IMPL_THUNK(118) IMPL_THUNK(119) IMPL_THUNK(120) IMPL_THUNK(121) IMPL_THUNK(122) IMPL_THUNK(123) IMPL_THUNK(124) IMPL_THUNK(125) IMPL_THUNK(126) IMPL_THUNK(127) IMPL_THUNK(128) IMPL_THUNK(129) IMPL_THUNK(130) IMPL_THUNK(131) IMPL_THUNK(132) IMPL_THUNK(133) IMPL_THUNK(134) IMPL_THUNK(135) IMPL_THUNK(136) IMPL_THUNK(137) IMPL_THUNK(138) IMPL_THUNK(139) IMPL_THUNK(140) IMPL_THUNK(141) IMPL_THUNK(142) IMPL_THUNK(143) IMPL_THUNK(144) IMPL_THUNK(145) IMPL_THUNK(146) IMPL_THUNK(147) IMPL_THUNK(148) IMPL_THUNK(149) IMPL_THUNK(150) IMPL_THUNK(151) IMPL_THUNK(152) IMPL_THUNK(153) IMPL_THUNK(154) IMPL_THUNK(155) IMPL_THUNK(156) IMPL_THUNK(157) IMPL_THUNK(158) IMPL_THUNK(159) IMPL_THUNK(160) IMPL_THUNK(161) IMPL_THUNK(162) IMPL_THUNK(163) IMPL_THUNK(164) IMPL_THUNK(165) IMPL_THUNK(166) IMPL_THUNK(167) IMPL_THUNK(168) IMPL_THUNK(169) IMPL_THUNK(170) IMPL_THUNK(171) IMPL_THUNK(172) IMPL_THUNK(173) IMPL_THUNK(174) IMPL_THUNK(175) IMPL_THUNK(176) IMPL_THUNK(177) IMPL_THUNK(178) IMPL_THUNK(179) IMPL_THUNK(180) IMPL_THUNK(181) IMPL_THUNK(182) IMPL_THUNK(183) IMPL_THUNK(184) IMPL_THUNK(185) IMPL_THUNK(186) IMPL_THUNK(187) IMPL_THUNK(188) IMPL_THUNK(189) IMPL_THUNK(190) IMPL_THUNK(191) IMPL_THUNK(192) IMPL_THUNK(193) IMPL_THUNK(194) IMPL_THUNK(195) IMPL_THUNK(196) IMPL_THUNK(197) IMPL_THUNK(198) IMPL_THUNK(199) IMPL_THUNK(200) IMPL_THUNK(201) IMPL_THUNK(202) IMPL_THUNK(203) IMPL_THUNK(204) IMPL_THUNK(205) IMPL_THUNK(206) IMPL_THUNK(207) IMPL_THUNK(208) IMPL_THUNK(209) IMPL_THUNK(210) IMPL_THUNK(211) IMPL_THUNK(212) IMPL_THUNK(213) IMPL_THUNK(214) IMPL_THUNK(215) IMPL_THUNK(216) IMPL_THUNK(217) IMPL_THUNK(218) IMPL_THUNK(219) IMPL_THUNK(220) IMPL_THUNK(221) IMPL_THUNK(222) IMPL_THUNK(223) IMPL_THUNK(224) IMPL_THUNK(225) IMPL_THUNK(226) IMPL_THUNK(227) IMPL_THUNK(228) IMPL_THUNK(229) IMPL_THUNK(230) IMPL_THUNK(231) IMPL_THUNK(232) IMPL_THUNK(233) IMPL_THUNK(234) IMPL_THUNK(235) IMPL_THUNK(236) IMPL_THUNK(237) IMPL_THUNK(238) IMPL_THUNK(239) IMPL_THUNK(240) IMPL_THUNK(241) IMPL_THUNK(242) IMPL_THUNK(243) IMPL_THUNK(244) IMPL_THUNK(245) IMPL_THUNK(246) IMPL_THUNK(247) IMPL_THUNK(248) IMPL_THUNK(249) IMPL_THUNK(250) IMPL_THUNK(251) IMPL_THUNK(252) IMPL_THUNK(253) IMPL_THUNK(254) IMPL_THUNK(255) IMPL_THUNK(256) IMPL_THUNK(257) IMPL_THUNK(258) IMPL_THUNK(259) IMPL_THUNK(260) IMPL_THUNK(261) IMPL_THUNK(262) IMPL_THUNK(263) IMPL_THUNK(264) IMPL_THUNK(265) IMPL_THUNK(266) IMPL_THUNK(267) IMPL_THUNK(268) IMPL_THUNK(269) IMPL_THUNK(270) IMPL_THUNK(271) IMPL_THUNK(272) IMPL_THUNK(273) IMPL_THUNK(274) IMPL_THUNK(275) IMPL_THUNK(276) IMPL_THUNK(277) IMPL_THUNK(278) IMPL_THUNK(279) IMPL_THUNK(280) IMPL_THUNK(281) IMPL_THUNK(282) IMPL_THUNK(283) IMPL_THUNK(284) IMPL_THUNK(285) IMPL_THUNK(286) IMPL_THUNK(287) IMPL_THUNK(288) IMPL_THUNK(289) IMPL_THUNK(290) IMPL_THUNK(291) IMPL_THUNK(292) IMPL_THUNK(293) IMPL_THUNK(294) IMPL_THUNK(295) IMPL_THUNK(296) IMPL_THUNK(297) IMPL_THUNK(298) IMPL_THUNK(299) IMPL_THUNK(300) IMPL_THUNK(301) IMPL_THUNK(302) IMPL_THUNK(303) IMPL_THUNK(304) IMPL_THUNK(305) IMPL_THUNK(306) IMPL_THUNK(307) IMPL_THUNK(308) IMPL_THUNK(309) IMPL_THUNK(310) IMPL_THUNK(311) IMPL_THUNK(312) IMPL_THUNK(313) IMPL_THUNK(314) IMPL_THUNK(315) IMPL_THUNK(316) IMPL_THUNK(317) IMPL_THUNK(318) IMPL_THUNK(319) IMPL_THUNK(320) IMPL_THUNK(321) IMPL_THUNK(322) IMPL_THUNK(323) IMPL_THUNK(324) IMPL_THUNK(325) IMPL_THUNK(326) IMPL_THUNK(327) IMPL_THUNK(328) IMPL_THUNK(329) IMPL_THUNK(330) IMPL_THUNK(331) IMPL_THUNK(332) IMPL_THUNK(333) IMPL_THUNK(334) IMPL_THUNK(335) IMPL_THUNK(336) IMPL_THUNK(337) IMPL_THUNK(338) IMPL_THUNK(339) IMPL_THUNK(340) IMPL_THUNK(341) IMPL_THUNK(342) IMPL_THUNK(343) IMPL_THUNK(344) IMPL_THUNK(345) IMPL_THUNK(346) IMPL_THUNK(347) IMPL_THUNK(348) IMPL_THUNK(349) IMPL_THUNK(350) IMPL_THUNK(351) IMPL_THUNK(352) IMPL_THUNK(353) IMPL_THUNK(354) IMPL_THUNK(355) IMPL_THUNK(356) IMPL_THUNK(357) IMPL_THUNK(358) IMPL_THUNK(359) IMPL_THUNK(360) IMPL_THUNK(361) IMPL_THUNK(362) IMPL_THUNK(363) IMPL_THUNK(364) IMPL_THUNK(365) IMPL_THUNK(366) IMPL_THUNK(367) IMPL_THUNK(368) IMPL_THUNK(369) IMPL_THUNK(370) IMPL_THUNK(371) IMPL_THUNK(372) IMPL_THUNK(373) IMPL_THUNK(374) IMPL_THUNK(375) IMPL_THUNK(376) IMPL_THUNK(377) IMPL_THUNK(378) IMPL_THUNK(379) IMPL_THUNK(380) IMPL_THUNK(381) IMPL_THUNK(382) IMPL_THUNK(383) IMPL_THUNK(384) IMPL_THUNK(385) IMPL_THUNK(386) IMPL_THUNK(387) IMPL_THUNK(388) IMPL_THUNK(389) IMPL_THUNK(390) IMPL_THUNK(391) IMPL_THUNK(392) IMPL_THUNK(393) IMPL_THUNK(394) IMPL_THUNK(395) IMPL_THUNK(396) IMPL_THUNK(397) IMPL_THUNK(398) IMPL_THUNK(399) IMPL_THUNK(400) IMPL_THUNK(401) IMPL_THUNK(402) IMPL_THUNK(403) IMPL_THUNK(404) IMPL_THUNK(405) IMPL_THUNK(406) IMPL_THUNK(407) IMPL_THUNK(408) IMPL_THUNK(409) IMPL_THUNK(410) IMPL_THUNK(411) IMPL_THUNK(412) IMPL_THUNK(413) IMPL_THUNK(414) IMPL_THUNK(415) IMPL_THUNK(416) IMPL_THUNK(417) IMPL_THUNK(418) IMPL_THUNK(419) IMPL_THUNK(420) IMPL_THUNK(421) IMPL_THUNK(422) IMPL_THUNK(423) IMPL_THUNK(424) IMPL_THUNK(425) IMPL_THUNK(426) IMPL_THUNK(427) IMPL_THUNK(428) IMPL_THUNK(429) IMPL_THUNK(430) IMPL_THUNK(431) IMPL_THUNK(432) IMPL_THUNK(433) IMPL_THUNK(434) IMPL_THUNK(435) IMPL_THUNK(436) IMPL_THUNK(437) IMPL_THUNK(438) IMPL_THUNK(439) IMPL_THUNK(440) IMPL_THUNK(441) IMPL_THUNK(442) IMPL_THUNK(443) IMPL_THUNK(444) IMPL_THUNK(445) IMPL_THUNK(446) IMPL_THUNK(447) IMPL_THUNK(448) IMPL_THUNK(449) IMPL_THUNK(450) IMPL_THUNK(451) IMPL_THUNK(452) IMPL_THUNK(453) IMPL_THUNK(454) IMPL_THUNK(455) IMPL_THUNK(456) IMPL_THUNK(457) IMPL_THUNK(458) IMPL_THUNK(459) IMPL_THUNK(460) IMPL_THUNK(461) IMPL_THUNK(462) IMPL_THUNK(463) IMPL_THUNK(464) IMPL_THUNK(465) IMPL_THUNK(466) IMPL_THUNK(467) IMPL_THUNK(468) IMPL_THUNK(469) IMPL_THUNK(470) IMPL_THUNK(471) IMPL_THUNK(472) IMPL_THUNK(473) IMPL_THUNK(474) IMPL_THUNK(475) IMPL_THUNK(476) IMPL_THUNK(477) IMPL_THUNK(478) IMPL_THUNK(479) IMPL_THUNK(480) IMPL_THUNK(481) IMPL_THUNK(482) IMPL_THUNK(483) IMPL_THUNK(484) IMPL_THUNK(485) IMPL_THUNK(486) IMPL_THUNK(487) IMPL_THUNK(488) IMPL_THUNK(489) IMPL_THUNK(490) IMPL_THUNK(491) IMPL_THUNK(492) IMPL_THUNK(493) IMPL_THUNK(494) IMPL_THUNK(495) IMPL_THUNK(496) IMPL_THUNK(497) IMPL_THUNK(498) IMPL_THUNK(499) IMPL_THUNK(500) IMPL_THUNK(501) IMPL_THUNK(502) IMPL_THUNK(503) IMPL_THUNK(504) IMPL_THUNK(505) IMPL_THUNK(506) IMPL_THUNK(507) IMPL_THUNK(508) IMPL_THUNK(509) IMPL_THUNK(510) IMPL_THUNK(511) IMPL_THUNK(512) IMPL_THUNK(513) IMPL_THUNK(514) IMPL_THUNK(515) IMPL_THUNK(516) IMPL_THUNK(517) IMPL_THUNK(518) IMPL_THUNK(519) IMPL_THUNK(520) IMPL_THUNK(521) IMPL_THUNK(522) IMPL_THUNK(523) IMPL_THUNK(524) IMPL_THUNK(525) IMPL_THUNK(526) IMPL_THUNK(527) IMPL_THUNK(528) IMPL_THUNK(529) IMPL_THUNK(530) IMPL_THUNK(531) IMPL_THUNK(532) IMPL_THUNK(533) IMPL_THUNK(534) IMPL_THUNK(535) IMPL_THUNK(536) IMPL_THUNK(537) IMPL_THUNK(538) IMPL_THUNK(539) IMPL_THUNK(540) IMPL_THUNK(541) IMPL_THUNK(542) IMPL_THUNK(543) IMPL_THUNK(544) IMPL_THUNK(545) IMPL_THUNK(546) IMPL_THUNK(547) IMPL_THUNK(548) IMPL_THUNK(549) IMPL_THUNK(550) IMPL_THUNK(551) IMPL_THUNK(552) IMPL_THUNK(553) IMPL_THUNK(554) IMPL_THUNK(555) IMPL_THUNK(556) IMPL_THUNK(557) IMPL_THUNK(558) IMPL_THUNK(559) IMPL_THUNK(560) IMPL_THUNK(561) IMPL_THUNK(562) IMPL_THUNK(563) IMPL_THUNK(564) IMPL_THUNK(565) IMPL_THUNK(566) IMPL_THUNK(567) IMPL_THUNK(568) IMPL_THUNK(569) IMPL_THUNK(570) IMPL_THUNK(571) IMPL_THUNK(572) IMPL_THUNK(573) IMPL_THUNK(574) IMPL_THUNK(575) IMPL_THUNK(576) IMPL_THUNK(577) IMPL_THUNK(578) IMPL_THUNK(579) IMPL_THUNK(580) IMPL_THUNK(581) IMPL_THUNK(582) IMPL_THUNK(583) IMPL_THUNK(584) IMPL_THUNK(585) IMPL_THUNK(586) IMPL_THUNK(587) IMPL_THUNK(588) IMPL_THUNK(589) IMPL_THUNK(590) IMPL_THUNK(591) IMPL_THUNK(592) IMPL_THUNK(593) IMPL_THUNK(594) IMPL_THUNK(595) IMPL_THUNK(596) IMPL_THUNK(597) IMPL_THUNK(598) IMPL_THUNK(599) IMPL_THUNK(600) IMPL_THUNK(601) IMPL_THUNK(602) IMPL_THUNK(603) IMPL_THUNK(604) IMPL_THUNK(605) IMPL_THUNK(606) IMPL_THUNK(607) IMPL_THUNK(608) IMPL_THUNK(609) IMPL_THUNK(610) IMPL_THUNK(611) IMPL_THUNK(612) IMPL_THUNK(613) IMPL_THUNK(614) IMPL_THUNK(615) IMPL_THUNK(616) IMPL_THUNK(617) IMPL_THUNK(618) IMPL_THUNK(619) IMPL_THUNK(620) IMPL_THUNK(621) IMPL_THUNK(622) IMPL_THUNK(623) IMPL_THUNK(624) IMPL_THUNK(625) IMPL_THUNK(626) IMPL_THUNK(627) IMPL_THUNK(628) IMPL_THUNK(629) IMPL_THUNK(630) IMPL_THUNK(631) IMPL_THUNK(632) IMPL_THUNK(633) IMPL_THUNK(634) IMPL_THUNK(635) IMPL_THUNK(636) IMPL_THUNK(637) IMPL_THUNK(638) IMPL_THUNK(639) IMPL_THUNK(640) IMPL_THUNK(641) IMPL_THUNK(642) IMPL_THUNK(643) IMPL_THUNK(644) IMPL_THUNK(645) IMPL_THUNK(646) IMPL_THUNK(647) IMPL_THUNK(648) IMPL_THUNK(649) IMPL_THUNK(650) IMPL_THUNK(651) IMPL_THUNK(652) IMPL_THUNK(653) IMPL_THUNK(654) IMPL_THUNK(655) IMPL_THUNK(656) IMPL_THUNK(657) IMPL_THUNK(658) IMPL_THUNK(659) IMPL_THUNK(660) IMPL_THUNK(661) IMPL_THUNK(662) IMPL_THUNK(663) IMPL_THUNK(664) IMPL_THUNK(665) IMPL_THUNK(666) IMPL_THUNK(667) IMPL_THUNK(668) IMPL_THUNK(669) IMPL_THUNK(670) IMPL_THUNK(671) IMPL_THUNK(672) IMPL_THUNK(673) IMPL_THUNK(674) IMPL_THUNK(675) IMPL_THUNK(676) IMPL_THUNK(677) IMPL_THUNK(678) IMPL_THUNK(679) IMPL_THUNK(680) IMPL_THUNK(681) IMPL_THUNK(682) IMPL_THUNK(683) IMPL_THUNK(684) IMPL_THUNK(685) IMPL_THUNK(686) IMPL_THUNK(687) IMPL_THUNK(688) IMPL_THUNK(689) IMPL_THUNK(690) IMPL_THUNK(691) IMPL_THUNK(692) IMPL_THUNK(693) IMPL_THUNK(694) IMPL_THUNK(695) IMPL_THUNK(696) IMPL_THUNK(697) IMPL_THUNK(698) IMPL_THUNK(699) IMPL_THUNK(700) IMPL_THUNK(701) IMPL_THUNK(702) IMPL_THUNK(703) IMPL_THUNK(704) IMPL_THUNK(705) IMPL_THUNK(706) IMPL_THUNK(707) IMPL_THUNK(708) IMPL_THUNK(709) IMPL_THUNK(710) IMPL_THUNK(711) IMPL_THUNK(712) IMPL_THUNK(713) IMPL_THUNK(714) IMPL_THUNK(715) IMPL_THUNK(716) IMPL_THUNK(717) IMPL_THUNK(718) IMPL_THUNK(719) IMPL_THUNK(720) IMPL_THUNK(721) IMPL_THUNK(722) IMPL_THUNK(723) IMPL_THUNK(724) IMPL_THUNK(725) IMPL_THUNK(726) IMPL_THUNK(727) IMPL_THUNK(728) IMPL_THUNK(729) IMPL_THUNK(730) IMPL_THUNK(731) IMPL_THUNK(732) IMPL_THUNK(733) IMPL_THUNK(734) IMPL_THUNK(735) IMPL_THUNK(736) IMPL_THUNK(737) IMPL_THUNK(738) IMPL_THUNK(739) IMPL_THUNK(740) IMPL_THUNK(741) IMPL_THUNK(742) IMPL_THUNK(743) IMPL_THUNK(744) IMPL_THUNK(745) IMPL_THUNK(746) IMPL_THUNK(747) IMPL_THUNK(748) IMPL_THUNK(749) IMPL_THUNK(750) IMPL_THUNK(751) IMPL_THUNK(752) IMPL_THUNK(753) IMPL_THUNK(754) IMPL_THUNK(755) IMPL_THUNK(756) IMPL_THUNK(757) IMPL_THUNK(758) IMPL_THUNK(759) IMPL_THUNK(760) IMPL_THUNK(761) IMPL_THUNK(762) IMPL_THUNK(763) IMPL_THUNK(764) IMPL_THUNK(765) IMPL_THUNK(766) IMPL_THUNK(767) IMPL_THUNK(768) IMPL_THUNK(769) IMPL_THUNK(770) IMPL_THUNK(771) IMPL_THUNK(772) IMPL_THUNK(773) IMPL_THUNK(774) IMPL_THUNK(775) IMPL_THUNK(776) IMPL_THUNK(777) IMPL_THUNK(778) IMPL_THUNK(779) IMPL_THUNK(780) IMPL_THUNK(781) IMPL_THUNK(782) IMPL_THUNK(783) IMPL_THUNK(784) IMPL_THUNK(785) IMPL_THUNK(786) IMPL_THUNK(787) IMPL_THUNK(788) IMPL_THUNK(789) IMPL_THUNK(790) IMPL_THUNK(791) IMPL_THUNK(792) IMPL_THUNK(793) IMPL_THUNK(794) IMPL_THUNK(795) IMPL_THUNK(796) IMPL_THUNK(797) IMPL_THUNK(798) IMPL_THUNK(799) IMPL_THUNK(800) IMPL_THUNK(801) IMPL_THUNK(802) IMPL_THUNK(803) IMPL_THUNK(804) IMPL_THUNK(805) IMPL_THUNK(806) IMPL_THUNK(807) IMPL_THUNK(808) IMPL_THUNK(809) IMPL_THUNK(810) IMPL_THUNK(811) IMPL_THUNK(812) IMPL_THUNK(813) IMPL_THUNK(814) IMPL_THUNK(815) IMPL_THUNK(816) IMPL_THUNK(817) IMPL_THUNK(818) IMPL_THUNK(819) IMPL_THUNK(820) IMPL_THUNK(821) IMPL_THUNK(822) IMPL_THUNK(823) IMPL_THUNK(824) IMPL_THUNK(825) IMPL_THUNK(826) IMPL_THUNK(827) IMPL_THUNK(828) IMPL_THUNK(829) IMPL_THUNK(830) IMPL_THUNK(831) IMPL_THUNK(832) IMPL_THUNK(833) IMPL_THUNK(834) IMPL_THUNK(835) IMPL_THUNK(836) IMPL_THUNK(837) IMPL_THUNK(838) IMPL_THUNK(839) IMPL_THUNK(840) IMPL_THUNK(841) IMPL_THUNK(842) IMPL_THUNK(843) IMPL_THUNK(844) IMPL_THUNK(845) IMPL_THUNK(846) IMPL_THUNK(847) IMPL_THUNK(848) IMPL_THUNK(849) IMPL_THUNK(850) IMPL_THUNK(851) IMPL_THUNK(852) IMPL_THUNK(853) IMPL_THUNK(854) IMPL_THUNK(855) IMPL_THUNK(856) IMPL_THUNK(857) IMPL_THUNK(858) IMPL_THUNK(859) IMPL_THUNK(860) IMPL_THUNK(861) IMPL_THUNK(862) IMPL_THUNK(863) IMPL_THUNK(864) IMPL_THUNK(865) IMPL_THUNK(866) IMPL_THUNK(867) IMPL_THUNK(868) IMPL_THUNK(869) IMPL_THUNK(870) IMPL_THUNK(871) IMPL_THUNK(872) IMPL_THUNK(873) IMPL_THUNK(874) IMPL_THUNK(875) IMPL_THUNK(876) IMPL_THUNK(877) IMPL_THUNK(878) IMPL_THUNK(879) IMPL_THUNK(880) IMPL_THUNK(881) IMPL_THUNK(882) IMPL_THUNK(883) IMPL_THUNK(884) IMPL_THUNK(885) IMPL_THUNK(886) IMPL_THUNK(887) IMPL_THUNK(888) IMPL_THUNK(889) IMPL_THUNK(890) IMPL_THUNK(891) IMPL_THUNK(892) IMPL_THUNK(893) IMPL_THUNK(894) IMPL_THUNK(895) IMPL_THUNK(896) IMPL_THUNK(897) IMPL_THUNK(898) IMPL_THUNK(899) IMPL_THUNK(900) IMPL_THUNK(901) IMPL_THUNK(902) IMPL_THUNK(903) IMPL_THUNK(904) IMPL_THUNK(905) IMPL_THUNK(906) IMPL_THUNK(907) IMPL_THUNK(908) IMPL_THUNK(909) IMPL_THUNK(910) IMPL_THUNK(911) IMPL_THUNK(912) IMPL_THUNK(913) IMPL_THUNK(914) IMPL_THUNK(915) IMPL_THUNK(916) IMPL_THUNK(917) IMPL_THUNK(918) IMPL_THUNK(919) IMPL_THUNK(920) IMPL_THUNK(921) IMPL_THUNK(922) IMPL_THUNK(923) IMPL_THUNK(924) IMPL_THUNK(925) IMPL_THUNK(926) IMPL_THUNK(927) IMPL_THUNK(928) IMPL_THUNK(929) IMPL_THUNK(930) IMPL_THUNK(931) IMPL_THUNK(932) IMPL_THUNK(933) IMPL_THUNK(934) IMPL_THUNK(935) IMPL_THUNK(936) IMPL_THUNK(937) IMPL_THUNK(938) IMPL_THUNK(939) IMPL_THUNK(940) IMPL_THUNK(941) IMPL_THUNK(942) IMPL_THUNK(943) IMPL_THUNK(944) IMPL_THUNK(945) IMPL_THUNK(946) IMPL_THUNK(947) IMPL_THUNK(948) IMPL_THUNK(949) IMPL_THUNK(950) IMPL_THUNK(951) IMPL_THUNK(952) IMPL_THUNK(953) IMPL_THUNK(954) IMPL_THUNK(955) IMPL_THUNK(956) IMPL_THUNK(957) IMPL_THUNK(958) IMPL_THUNK(959) IMPL_THUNK(960) IMPL_THUNK(961) IMPL_THUNK(962) IMPL_THUNK(963) IMPL_THUNK(964) IMPL_THUNK(965) IMPL_THUNK(966) IMPL_THUNK(967) IMPL_THUNK(968) IMPL_THUNK(969) IMPL_THUNK(970) IMPL_THUNK(971) IMPL_THUNK(972) IMPL_THUNK(973) IMPL_THUNK(974) IMPL_THUNK(975) IMPL_THUNK(976) IMPL_THUNK(977) IMPL_THUNK(978) IMPL_THUNK(979) IMPL_THUNK(980) IMPL_THUNK(981) IMPL_THUNK(982) IMPL_THUNK(983) IMPL_THUNK(984) IMPL_THUNK(985) IMPL_THUNK(986) IMPL_THUNK(987) IMPL_THUNK(988) IMPL_THUNK(989) IMPL_THUNK(990) IMPL_THUNK(991) IMPL_THUNK(992) IMPL_THUNK(993) IMPL_THUNK(994) IMPL_THUNK(995) IMPL_THUNK(996) IMPL_THUNK(997) IMPL_THUNK(998) IMPL_THUNK(999) IMPL_THUNK(1000) IMPL_THUNK(1001) IMPL_THUNK(1002) IMPL_THUNK(1003) IMPL_THUNK(1004) IMPL_THUNK(1005) IMPL_THUNK(1006) IMPL_THUNK(1007) IMPL_THUNK(1008) IMPL_THUNK(1009) IMPL_THUNK(1010) IMPL_THUNK(1011) IMPL_THUNK(1012) IMPL_THUNK(1013) IMPL_THUNK(1014) IMPL_THUNK(1015) IMPL_THUNK(1016) IMPL_THUNK(1017) IMPL_THUNK(1018) IMPL_THUNK(1019) IMPL_THUNK(1020) IMPL_THUNK(1021) IMPL_THUNK(1022) IMPL_THUNK(1023) IMPL_THUNK(1024)