ITE8591 發表於 2012-12-11 14:55:57

source code for 多開

看了懂了 就修改下列function 即可
        bool EnableMultiMS()
        {
                int handleCount = 1024;

                HMODULE ntdll = GetModuleHandle(L"ntdll");
                if (ntdll == NULL)
                {
                        Log(L"Couldn't get ntdll handle\n");
                        return false;
                }

                NtQueryObject_t ntQO = (NtQueryObject_t)GetProcAddress(ntdll, "NtQueryObject");
                NtQuerySystemInformation_t ntQSI = (NtQuerySystemInformation_t)GetProcAddress(ntdll, "NtQuerySystemInformation");
                if (ntQO == NULL || ntQSI == NULL)
                {
                        Log(L"Couldn't find procedures for MultiMS (%x / %x)\n", ntQO, ntQSI);
                        return false;
                }

                struct HandleInfoSet
                {
                        unsigned int count;
                        SYSTEM_HANDLE_INFORMATION handles;
                };

                HandleInfoSet *infoSet = (HandleInfoSet *)malloc(4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount);
                DWORD length;

                NTSTATUS status = ntQSI((SYSTEM_INFORMATION_CLASS)16, infoSet, 4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount, &length);

                Log(L"alloc with %i // %i\n", handleCount, handleCount * sizeof(SYSTEM_HANDLE_INFORMATION) + 4);

                while (status == 0xc0000004 /*STATUS_INFO_LENGTH_MISMATCH*/)
                {
                        free(infoSet);

                        handleCount *= 2;

                        Log(L"alloc with %i // %i\n", handleCount, handleCount * sizeof(SYSTEM_HANDLE_INFORMATION) + 4);
                        infoSet = (HandleInfoSet *)malloc(4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount);
                        status = ntQSI((SYSTEM_INFORMATION_CLASS)16, infoSet, 4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount, &length);
                }

                if (status != 0 /*STATUS_SUCCESS*/)
                {
                        Log(L"Failed to enumerate handles open by this process (errorcode %x)\n", status);
                        free(infoSet);
                        return false;
                }

                for (unsigned int i = 0; i < infoSet->count; i++)
                {
                        wchar_t nameBuffer;
                        if (infoSet->handles.handle == 0x0012019F) continue;        // some buggy thing we need to skip
                        status = ntQO((HANDLE)infoSet->handles.handle, (OBJECT_INFORMATION_CLASS)1, nameBuffer, 1024, &length);
                        if (status != 0 /*STATUS_SUCCESS*/)
                                continue;

                        if (wcsstr(nameBuffer + 4, L"WvsClientMtx") != NULL)
                        {
                                HANDLE handle;
                                DuplicateHandle(GetCurrentProcess(), (HANDLE)infoSet->handles.handle, 0, &handle, 0, FALSE, DUPLICATE_CLOSE_SOURCE);
                                CloseHandle(handle);
                                Log(L"Mutex closed, MultiMS is ok\n");
                                break;
                        }
                }

                free(infoSet);
                return true;
        }

cxxxx 發表於 2012-12-11 16:06:29

很明顯現在的版本沒有那麼簡單了。。。

q28814028 發表於 2012-12-13 22:09:28

ggc0131 發表於 2013-1-31 23:05:26

頁: [1]
查看完整版本: source code for 多開