- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
class LoaderLock
{
public:
void lock();
void unlock();
bool IsLocked() const;
LoaderLock() = default;
private:
LoaderLock(LoaderLock&) = delete;
LoaderLock(LoaderLock&&) = delete;
LoaderLock& operator=(LoaderLock&) = delete;
LoaderLock& operator=(LoaderLock&&) = delete;
bool _Locked = false;
ULONG _cookie = 0;
std::unique_ptr<void, std::function<void(void*)>> _ntdll{ LoadLibrary("NTDLL.DLL"), [](void* h){if (h)FreeLibrary((HMODULE)h); } };
typedef NTSTATUS(__stdcall*LdrLockLoaderLockFunc)(
ULONG Flags,
ULONG *State,
ULONG *Cookie);
LdrLockLoaderLockFunc _LdrLockLoaderLock = !_ntdll ? 0 : (LdrLockLoaderLockFunc)GetProcAddress((HMODULE)_ntdll.get(), "LdrLockLoaderLock");
typedef NTSTATUS(__stdcall*LdrUnlockLoaderLockFunc)(
ULONG Flags,
ULONG Cookie);
LdrUnlockLoaderLockFunc _LdrUnlockLoaderLock = !_ntdll ? 0 : (LdrUnlockLoaderLockFunc)GetProcAddress((HMODULE)_ntdll.get(), "LdrUnlockLoaderLock");
};
Уже давно минул 2014 год, а C++11 не перестает радовать нас размазанными по интерфейсу конструкторами и деструкторами.
http://pastebin.com/fsEZ3Avr
Как хорошо быть Си мастер рейс.
Кем и почему? ну и лучше unique_ptr<void, void(*)(void*)>
Yo dawg
Полное API, наверное, выглядит так:
LdrLockLoaderLock
LdrUnlockLoaderLock
LdrLockLoaderUnlock
LdrUnlockLoaderUnlock
LdrLockUnloaderLock
LdrUnlockUnloaderLock
LdrLockUnloaderUnlock
LdrUnlockUnloaderUnlock
Ловить дедлок в такой схеме, наверное, было бы равноценно потеряться в пятимерном пространстве.
А этот лок нереентерабельный?
И при этом выглядит как ёбаный пиздец, угу. Моё Library по крайней мере хоть какие-то зайчатки инкапсуляции и удобства показывает...
Тебя походу торкнули фигурные скобки
Пытаюсь юзерскипты поставить
Я даже прокси-чекер накомпелял, но девайся нет, тоска.
http://implement.do.am/Images/6545435345.png
Прога должна была увидеть свет пару лет назад. Проект изначально разрабатывался на AutoIt, потом был переписан на PureBasic и наконец на Delphi. Затем я взялся переписывать код на FreePascal, чтобы прогу можно было безбоязненно распространять, но встретил на пути слишком много препятствий.
Чет мне кажется что наш уютненький не поддерживает нормального апи так что придётся парсить хтмл ручками
Креститься надо. Само собой не поддерживает... Но, с другой стороны, тут няшный xhtml, который вполне жрётся xml парсерами.
В любом случае сейчас у меня предсессия, потоп в конце июня сессия, так что пока запишу в хотели, если не обленюсь буду летом пилить
Где здесь пропущена запятая?
Других ошибок нет
Мда. Главное - сделать парсилку потоньше, а то вдруг API добавят.
Имхо, вреда от API не будет - все, кто хотел, уже ботов написали.
Василий, подробнее
Бля а я то все думал, что это все тот же чел, только после обострения.
ШОК за Семена в ГК срал его злой брат близнец. [u]Смотреть онлайн (Только для владельцев платных аккаунтов)[u]
Безумие, да?)
Since this app is more a pilot study than a real product I worked on Tampermonkey for Dolphin browser quite a while and found recently the time to bring it into a beta state. You can get it from here:
https://play.google.com/store/apps/details?id=net.tampermonkey.dolphin
учитывая, что ему ещё и браузер особенный нужен...
ЗАТО БЕСПЛАТНО!
может мозилка и грейсманки под ведром смогут?
потому что ты обработку ошибок забыл.
ну ты как бы сверху и привел часть их реализации. GetProcAddr() без проверки возврата непредсказуемая штука.
ЗЫ по моему опыту такой syntax sugar только частично помогает. грабли наступают тогда когда в разных версиях виндов у функций аргументы (и/или их типы) меняются. и версию виндов надо динамичски проверять...
А насчёт разных аргументов можно вот так попробовать (искуственный пример):
только в прикладухе народ усиленно страдает "не хочу ничего про систему слышать и видеть, лучше еще какую библиотечку качнуть".
либа решает виндово-специфические проблемы. на каком линухе класс проблем "недокументированые функции кернела и трахания с их вызовом" просто отсутствует. (все что нужно есть в хидерах, а новые фишки можно вызвать с помощью syscall() макро из libc.)
а если это какой плагиновый интерфейс, то есть более простые способы доступа, нежели чем куча GetProcAddr()/dlsym().
Перегрузкой оператора() выберется нужная версия SetCurrentDirectory
Я бы вообще предпочел загрузить только юникодную функцию и перегонять в неё из utf8.
Если required и не нашлась функция или либа - кидаем исключение сразу.
Если не required и не нашлась - кидаем исключение при вызове оператором (). Можно проверить оператором bool(), чтобы понять, есть ли эта функция в данной версии либы.
А то ведь везде где вызываешь расставлять ловлю исключений на тот случай если не загрузилась функция - та ещё упоротость
А если флаг required установлен - то исключение вылетит в момент конструирования, где его несложно поймать (или не ловить).
Как-то так я себе это представлял ;)
Распидорашу, если ещё раз меня так назовёшь.
Кстати, почему ты и Тарас так любите меня называть хуем?
Появление комментариев на ГК подобно испарению/кристаллизации. Нужен какой-то центр, вокруг которого начнёт расти кристалл дискуссии. Ну или, если сравнивать с испарением, центр парообразования дискуссии.
В выходные посетители обычно уходят с работы и не участвуют в обсуждениях, на ГК остаются только школьники, с этим ничего не поделать. А вот если календарь не показывает никаких праздников, надо начинать флудить и троллить, а не просто периодически обновлять сток, ведь все обновляют сток и не пишут комментарии, если им не на что ответить.
P.S. Код не taras-safe, слишком длинные строки.
LoadLibrary("NTDLL.DLL"),
[](void* h){if (h)FreeLibrary((HMODULE)h); }
};
> шаблон нужен лишь чтобы можно было пихать и функции, и лямбды, и std::function
И даже аллаха, если у него есть operator ().
> (HMODULE)h
Забавно, везде такие шаблоны модные, а при использовании всё равно сишный говнокаст писать.
Если точнее - T*, где T* - что-нибудь, во что может кастануться указатель на первый аргумент. Насчёт возврата void - х.з., должен проканать и не void, просто заигнорит результат.
В общем это функция, которую unique_ptr будет вызывать для освобождения указателя.
> сишный говнокаст
Причём этот HMODULE и есть void *, емнип.
Мне? :) Не надо мне приписывать код ОП'а...
fxd