-
Notifications
You must be signed in to change notification settings - Fork 119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GetLastError ERROR_ALREADY_EXISTS #150
Conversation
我不是特别明白。是否可以写一下示例? |
理论上是这样没错,但我实测中这个地方就是会谜之影响到我后面的getlasterror判断结果 |
我晚点看能不能搞个小的复现出来 |
话说你的WinMutex实现的也太复杂了吧……看的晕乎乎的。 不过感觉就是触发了你的代码是存在问题的。 正确的做法应该是 CreateMutexW后立即GetLastError。YY-Thunks会再CloseHandle会调用GetYY_ThunksSharedData。只能说恰好覆盖了你之前CreateMutexW的错误代码。 但是根源是你现在的代码没有再CreateMutexW后立即调用GetLastError。 |
啊这,不是才十几行么,您是不是看错了 https://github.com/HIllya51/LunaTranslator/blob/main/src/cpp/LunaHook/include/types.h#L3-L20 AutoHandle<>只是个简单的用raii自动closehandle的东西不用细究
肯定不是啊,这个mutex的CloseHandle要等viewMutex析构了(dll detach时)才会执行的,就是CreateMutexW后立即就会GetLastError的 |
是只有十几行,但是需要连续跳转3次才能才明白代码。这直接导致解读起来比较晦涩,身为作者你也中枪了对吧?
既然你说设置SetLasterror 0就能正常,假设这个成立,那么说明这中间一定执行了yY-Thunks里的那个GetSharedData。
所以我关注到了CloseHandle,你在全局定义了一个viewMutex,但是实际它在全局构造时构造函数已经构建了一个句柄。不信你可以看它的构造函数。
DllMain再次其实是赋值,此时智能句柄因为被赋值就触发了CloseHandle,把最初全局构造出来的句柄关闭。
最终,你的Getlasterror其实是在CloseHandle后执行的。
获取Outlook for Android<https://aka.ms/AAb9ysg>
…________________________________
From: 恍兮惚兮 ***@***.***>
Sent: Tuesday, March 11, 2025 6:54:45 PM
To: Chuyu-Team/YY-Thunks ***@***.***>
Cc: mingkuang ***@***.***>; Comment ***@***.***>
Subject: Re: [Chuyu-Team/YY-Thunks] GetLastError ERROR_ALREADY_EXISTS (PR #150)
话说你的WinMutex实现的也太复杂了吧……看的晕乎乎的。
啊这,不是才十几行么,您是不是看错了 https://github.com/HIllya51/LunaTranslator/blob/main/src/cpp/LunaHook/include/types.h#L3-L20 AutoHandle<>只是个简单的用raii自动closehandle的东西不用细究
不过感觉就是触发了你的代码是存在问题的。 viewMutex 先调用了CreateMutexW,然后调用了CloseHandle,然后再是GetLastError。
肯定不是啊,CloseHandle要等viewMutex析构了才会执行的,就是CreateMutexW后立即就会GetLastError的
―
Reply to this email directly, view it on GitHub<#150 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AEX7GZK5QL3FX3VTPXVLQFD2T26HLAVCNFSM6AAAAABYVL4UX2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDOMJTGY3TAMZUHA>.
You are receiving this because you commented.Message ID: ***@***.***>
[HIllya51]HIllya51 left a comment (Chuyu-Team/YY-Thunks#150)<#150 (comment)>
话说你的WinMutex实现的也太复杂了吧……看的晕乎乎的。
啊这,不是才十几行么,您是不是看错了 https://github.com/HIllya51/LunaTranslator/blob/main/src/cpp/LunaHook/include/types.h#L3-L20 AutoHandle<>只是个简单的用raii自动closehandle的东西不用细究
不过感觉就是触发了你的代码是存在问题的。 viewMutex 先调用了CreateMutexW,然后调用了CloseHandle,然后再是GetLastError。
肯定不是啊,CloseHandle要等viewMutex析构了才会执行的,就是CreateMutexW后立即就会GetLastError的
―
Reply to this email directly, view it on GitHub<#150 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AEX7GZK5QL3FX3VTPXVLQFD2T26HLAVCNFSM6AAAAABYVL4UX2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDOMJTGY3TAMZUHA>.
You are receiving this because you commented.Message ID: ***@***.***>
|
我建议代码层次尽量简单一些吧……
另外在全局定义非平坦的全局变量。这也不是推荐的行为。
获取Outlook for Android<https://aka.ms/AAb9ysg>
…________________________________
From: 徐 鹏捷 ***@***.***>
Sent: Tuesday, March 11, 2025 7:06:17 PM
To: Chuyu-Team/YY-Thunks ***@***.***>; Chuyu-Team/YY-Thunks ***@***.***>
Cc: Comment ***@***.***>
Subject: Re: [Chuyu-Team/YY-Thunks] GetLastError ERROR_ALREADY_EXISTS (PR #150)
是只有十几行,但是需要连续跳转3次才能才明白代码。这直接导致解读起来比较晦涩,身为作者你也中枪了对吧?
既然你说设置SetLasterror 0就能正常,假设这个成立,那么说明这中间一定执行了yY-Thunks里的那个GetSharedData。
所以我关注到了CloseHandle,你在全局定义了一个viewMutex,但是实际它在全局构造时构造函数已经构建了一个句柄。不信你可以看它的构造函数。
DllMain再次其实是赋值,此时智能句柄因为被赋值就触发了CloseHandle,把最初全局构造出来的句柄关闭。
最终,你的Getlasterror其实是在CloseHandle后执行的。
获取Outlook for Android<https://aka.ms/AAb9ysg>
________________________________
From: 恍兮惚兮 ***@***.***>
Sent: Tuesday, March 11, 2025 6:54:45 PM
To: Chuyu-Team/YY-Thunks ***@***.***>
Cc: mingkuang ***@***.***>; Comment ***@***.***>
Subject: Re: [Chuyu-Team/YY-Thunks] GetLastError ERROR_ALREADY_EXISTS (PR #150)
话说你的WinMutex实现的也太复杂了吧……看的晕乎乎的。
啊这,不是才十几行么,您是不是看错了 https://github.com/HIllya51/LunaTranslator/blob/main/src/cpp/LunaHook/include/types.h#L3-L20 AutoHandle<>只是个简单的用raii自动closehandle的东西不用细究
不过感觉就是触发了你的代码是存在问题的。 viewMutex 先调用了CreateMutexW,然后调用了CloseHandle,然后再是GetLastError。
肯定不是啊,CloseHandle要等viewMutex析构了才会执行的,就是CreateMutexW后立即就会GetLastError的
―
Reply to this email directly, view it on GitHub<#150 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AEX7GZK5QL3FX3VTPXVLQFD2T26HLAVCNFSM6AAAAABYVL4UX2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDOMJTGY3TAMZUHA>.
You are receiving this because you commented.Message ID: ***@***.***>
[HIllya51]HIllya51 left a comment (Chuyu-Team/YY-Thunks#150)<#150 (comment)>
话说你的WinMutex实现的也太复杂了吧……看的晕乎乎的。
啊这,不是才十几行么,您是不是看错了 https://github.com/HIllya51/LunaTranslator/blob/main/src/cpp/LunaHook/include/types.h#L3-L20 AutoHandle<>只是个简单的用raii自动closehandle的东西不用细究
不过感觉就是触发了你的代码是存在问题的。 viewMutex 先调用了CreateMutexW,然后调用了CloseHandle,然后再是GetLastError。
肯定不是啊,CloseHandle要等viewMutex析构了才会执行的,就是CreateMutexW后立即就会GetLastError的
―
Reply to this email directly, view it on GitHub<#150 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AEX7GZK5QL3FX3VTPXVLQFD2T26HLAVCNFSM6AAAAABYVL4UX2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDOMJTGY3TAMZUHA>.
You are receiving this because you commented.Message ID: ***@***.***>
|
如果有疑问可以继续回复,如果没有其他问题,那么将关闭这个PR。 故意把这个调用拆成2部分应该就能解决。或者让WinMutex默认不要构造出一个Mutex内核对象。 auto MutexTmp = WinMutex(ITH_HOOKMAN_MUTEX_ + std::to_wstring(GetCurrentProcessId()), &allAccess);
if (GetLastError() == ERROR_ALREADY_EXISTS)
return FALSE;
viewMutex = std::move(MutexTmp ); |
这个AutoHandle并不是我写的,是从textractor继承下来的,真的好迷,测试发现不知道为什么他会初始化为一个不是null的东西导致居然真的会closehandle一下 不过,即使我真的调用了CloseHandle进入到yythunks的某个内部函数,它也不应该修改lasterror的值吧,文档里也没有提到CloseHandle会修改lasterror。是否应该将yythunks函数改成在进入时先getlasterror然后退出时setlasterror更好一点? |
文档明确规定了 CloseHandle 失败时通过 GetLastError获取错误代码。我不知道你说的文档没有提到会修改……
|
不好意思,我眼瞎了... |
您觉得改成我刚才改的这样好不好?我现在完全没搞明白为什么会进入到GetYY_ThunksSharedData这个函数中,迷。 |
而且我试了一下,closehandle一个错误值并不会导致ERROR_ALREADY_EXISTS,它的错误值是ERROR_INVALID_HANDLE |
本末倒置了。 对于CloseHandle微软只承诺,失败时可以通过GetLastError获取错误代码,其他没有做承诺,你只是恰好遇到了成功时没有修改LastError。 |
另外你提交的代码也不好,目前也没有良好的保存LastError。后续链路那么长(MapViewOfFile等)……这些都是LastError修改潜在点。你的修改只是恰好规避了你目前环境的问题。 |
你关闭的又不是一个错误的值。你目前的代码关闭的是一个合法的句柄。 |
Opt, 保证GetYY_ThunksSharedData不修改LastError,缓解不及时调用GetLastError的代码逻辑异常。 |
DLL链接到yythunks,load&free&再次load时,如果在DLL中也有检测GetLastError ERROR_ALREADY_EXISTS的逻辑,会被这个所干扰导致失败。