1. C++ / Говнокод #26700

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    int ACMEncoder::Encode(int framepos, void *in, int in_avail, int *in_used, void *out, int out_avail)
    {
    	char *pin = (char *)in;
    	char *pout = (char *)out;
    	int retval = 0;
    
    	if (!m_did_header && do_header)
    	{
    		int s = 44;
    		s = 4 + 4 + 12 - 4;
    
    		int t;
    		if (m_convert_wfx.wfx.wFormatTag == WAVE_FORMAT_PCM) t = 0x10;
    		else t = sizeof(WAVEFORMATEX) + m_convert_wfx.wfx.cbSize;
    		s += 4 + t;
    		if (s&1) s++;
    
    		if (m_convert_wfx.wfx.wFormatTag != WAVE_FORMAT_PCM)
    			s += 12;
    
    		s += 8;
    
    		if (out_avail < s) return 0;
    		//xx bytes of randomness
    		m_hlen = s;
    		m_did_header = 1;
    		out_avail -= s;
    		pout += s;
    		retval = s;
    	}

    «Winamp» спиздили.

    Запостил: gost, 27 Мая 2020

    Комментарии (48) RSS

    • Какой «C/C++» )))
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • static BOOL GetLaunchActPermissionsWithIL (SECURITY_DESCRIPTOR **ppSD)
      {
      // Allow World Local Launch/Activation permissions. Label the SD for LOW IL Execute UP
          LPWSTR lpszSDDL = L"O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)";
      		   SECURITY_DESCRIPTOR *pSD;
          if (ConvertStringSecurityDescriptorToSecurityDescriptorW(lpszSDDL, SDDL_REVISION_1, (PSECURITY_DESCRIPTOR *)&pSD, NULL))
          {
              *ppSD = pSD;
              return TRUE;
          }
      		return FALSE;
      }

      Кусок «Winamp Elevator». Какой «Winapi» )))
      Ответить
    • HRESULT FileTypeRegistrar::RegisterMIMEType(const wchar_t *mimeType, const wchar_t *programName, const wchar_t *extension, int netscapeOnly)
      {
      	HKEY mp3Key;
      
      	if (!netscapeOnly)
      	{
      		wchar_t s[MAX_PATH];
      		if (RegCreateKeyW(HKEY_CLASSES_ROOT, extension, &mp3Key) == ERROR_SUCCESS)
      		{
      			SetValue(mp3Key, L"Content Type", mimeType);
      			RegCloseKey(mp3Key);
      		}
      		StringCchPrintfW(s, MAX_PATH, L"MIME\\Database\\Content Type\\%s", mimeType);
      		if (RegCreateKeyW(HKEY_CLASSES_ROOT, s, &mp3Key) == ERROR_SUCCESS)
      		{
      			RegDeleteValueW(mp3Key, L"CLSID");
      			SetValue(mp3Key, L"Extension", extension);
      			RegCloseKey(mp3Key);
      		}
      	}
      	if (RegOpenKeyW(HKEY_CURRENT_USER, L"Software\\Netscape\\Netscape Navigator\\Viewers", &mp3Key) == ERROR_SUCCESS)
      	{
      		SetValue(mp3Key, mimeType, programName);
      		for (int x = 0; x < 999; x ++)
      		{
      			wchar_t st[100];
      			DWORD vt;
      			DWORD s = 128;
      			wchar_t b[128];
      			StringCchPrintfW(st, 100, L"TYPE%d", x);
      			if (RegQueryValueExW(mp3Key, st, 0, &vt, (LPBYTE)b, &s) == ERROR_SUCCESS)
      			{
      				if (!wcscmp(b, mimeType)) break;
      			}
      			else
      			{
      				SetValue(mp3Key, st, mimeType);
      				break;
      			}
      		}
      		RegCloseKey(mp3Key);
      	}
      	return S_OK;
      }

      Как же всё таки охуенно с «Windows» взаимодействовать!
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Так ведь по-другому никак.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Потому что в «.reg-файле» нельзя разместить динамическую логику.
              Ответить
              • Тут регистрируется расширение для миме типа шела и нетскейпа.
                Что именно тут динамическое? Список расширений? Пути в реестре? миме тип?
                Ответить
                • Вот эта часть, например:
                  for (int x = 0; x < 999; x ++)
                  {
                      wchar_t st[100];
                      DWORD vt;
                      DWORD s = 128;
                      wchar_t b[128];
                      StringCchPrintfW(st, 100, L"TYPE%d", x);
                      if (RegQueryValueExW(mp3Key, st, 0, &vt, (LPBYTE)b, &s) == ERROR_SUCCESS)
                      {
                          if (!wcscmp(b, mimeType)) break;
                      }
                      else
                      {
                          SetValue(mp3Key, st, mimeType);
                          break;
                      }
                  }

                  Им нужно найти первый отсутствующий ключ «TYPE[0..998]» и записать туда своё значение (или не записывать ничего, если такой мимими-тип уже зарегистрирован).
                  Ответить
                  • Окей, принято. Но

                    Во-первых зачем первую-то часть писать на си?
                    Во-вторых это вопрос к ебланам из нешткафа, чтоу них надо вручную находить последний TYPE. И кстати не исключено, что у них есть API чтобы этого не делать.

                    Алсо, если уж пошла такая пьянка, то COM объект для работы с треестром был уже оченьт давно (причем это был automation, значит его можно было скриптушной прогать)
                    Ответить
                    • > Во-первых зачем первую-то часть писать на си?
                      Ну, видимо, чтобы всё было в одном месте.
                      Кстати, а как через «Winapi» этот .reg импортировать-то? Хуярить «ShellExecute»?
                      Ответить
                      • >ShellExecute
                        да, разумеется.

                        А еще есть свой установшщик
                        https://nsis.sourceforge.io/Registry_plug-in

                        почему не сделать там?
                        Ответить
                    • И, кстати, в некоторых плеерах есть возможность вручную выбрать список форматов, которые нужно зарегистрировать. В таком случае обойтись .reg-файлами будет весьма проблематично.
                      Ответить
                      • Это всё лучше бы делать установщику
                        Ответить
                        • Совсем не факт. В «Notepad++», например, есть возможность в любое время зарегистрировать/отрегистрировать нужные форматы, причём любые. И для этого его не нужно переустанавливать.
                          Ответить
                          • почему плозователю не сделать это через винду?

                            "открыть с помощью / всгеда использовать"?
                            Ответить
                            • Во-первых, потому что в «Notepad++» можно выбрать пункт «c, c++, cobj» и зарегистрировать сразу все сочетания «.c», «.cc», «.cpp», «.h» и прочие. Во-вторых, потому что это быстрее, чем создавать десяток файлов с нужными расширениями и регистрировать их через контекстное меню.
                              Ответить
                              • Даже для этого есть более высокуровнеый ShellAPI
                                https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/
                                Ответить
                                • И даже проигрыватель CD/DVD там задать можно?
                                  Ответить
                                  • Ну смотри: ассоциации майми типов с расширениями это вотчина уровня шелл, верно?
                                    Значит, тоже где-то там должно быть.

                                    Скорее всего CD имеет миме тип, он связан с обраточиком (или его глагол Open связан)

                                    Надоть МСДН читат
                                    Ответить
                                  • Гвость, я всё нашел

                                    https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-iapplicationassociationregistration

                                    ня
                                    Ответить
                                    • Because IApplicationAssociationRegistration is only supported for
                                      Windows Vista and Windows 7, applications that support earlier
                                      operating systems must use their preexisting code in relation
                                      to defaults when running under those operating systems.
                                      Those applications should include a check for the operating
                                      system version to account for this.
                                      
                                      Note  As of Windows 8, the only functionality of this
                                            interface that is supported is QueryCurrentDefault.

                                      Лол!
                                      Ответить
                              • Кстати, меня нарисовали на обложке книги про реестр

                                http://index-of.co.uk/Misc/O'Reilly%20Managing%20the%20Windows%202000%20Registry.pdf


                                Как главного эксперта
                                Ответить
                      • показать все, что скрытоvanished
                        Ответить
    • HRESULT FileTypeRegistrar::RegisterCDPlayer(const wchar_t *programName)
      {
      	wchar_t b[MAX_PATH];
      	wchar_t buf2[MAX_PATH];
      	HKEY mp3Key;
      	StringCchPrintfW(buf2, MAX_PATH, L"\"%s\" %%1", programName);
      	if (RegOpenKeyW(HKEY_CLASSES_ROOT, L"AudioCD\\shell\\play\\command", &mp3Key) == ERROR_SUCCESS)
      	{
      		DWORD s = sizeof(b)/sizeof(*b);
      		if (RegQueryValueEx(mp3Key, NULL, 0, NULL, (LPBYTE)b, &s) == ERROR_SUCCESS)
      		{
      			if (_wcsicmp(b, buf2))
      			{
      				wchar_t buf3[MAX_PATH];
      				DWORD st = sizeof(buf3)/sizeof(*buf3);
      				if (RegQueryValueExW(mp3Key, L"Winamp_Back", 0, NULL, (LPBYTE)buf3, &st) != ERROR_SUCCESS ||
      					_wcsicmp(buf3, b))
      				{
      					SetValue(mp3Key, L"Winamp_Back", b);
      				}
      				SetValue(mp3Key, buf2);
      			}
      		}
      		else SetValue(mp3Key, buf2);
      
      		RegCloseKey(mp3Key);
      	}
      	return S_OK;
      }

      Чуть ниже — UnregisterCDPlayer(), которая восстанавливает старое значение.
      Ответить
      • Унылый какой код всё таки. Скучный, и требующий внимательности. Как будто спички пересчитываешь.

        >DWORD st = sizeof(buf3)/sizeof(*buf3);
        ахахахха, какой крутой
        Ответить
    • HRESULT FileTypeRegistrar::RegisterType(const wchar_t *extension, const wchar_t *which_str, const wchar_t *prog_name) {
      // ...
      	if (version.dwMajorVersion >= 6) // Vista
      	{
      		TCHAR szKey[256];
      		StringCbPrintfW(szKey, sizeof(szKey), L"Software\\Clients\\Media\\%s\\Capabilities\\FileAssociations", prog_name);
      		if (ERROR_SUCCESS == RegCreateKeyW(HKEY_LOCAL_MACHINE, szKey, &mp3Key))
      		{
      			SetValue(mp3Key, extension, which_str);
      			// TODO: cache IApplicationAssociationRegistration
      			IApplicationAssociationRegistration* pAAR;
      
      			HRESULT hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration,
      				NULL,
      				CLSCTX_INPROC,
      				__uuidof(IApplicationAssociationRegistration),
      				(void**)&pAAR);
      			if (SUCCEEDED(hr))
      			{
      				hr = pAAR->SetAppAsDefault(prog_name, extension, AT_FILEEXTENSION);
      				pAAR->Release();
      			}
      
      			RegCloseKey(mp3Key);
      		}
      	}
      // ...
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Ну, кстати, в десятки они в этом направлении движутся, меню «Открыть как» переработали. Правда, там хорошо если десятая часть программ есть, указать полный путь к новой программе можно только раскрыв весь список и промотав до конца, а ещё они регулярно, блядь, сбрасываются, видимо, потому что обновлятор плеера пытается использовать какой-то способ регистрации, который был объявлен новым, годным и вообще бест практис, а через полгода задепрекейчен, забыт и предан забвению (см. выше про «IApplicationAssociationRegistration»).
        Ответить
    • как один и тот же человек в одном и том же продукте мешает int и DWORD
      Он что, питуз?
      Ответить

    Добавить комментарий