ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Как аккуратно(!) обнаружить подключение флешки?
  #1  
Старый 01.12.2008, 23:03
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


Question Как аккуратно(!) обнаружить подключение флешки?

Как это сделать аккуратно?То есть что бы и флопик не тарахтел,и процессор излишне на слабых машинах не грузился ,и что бы не возникало никаких подозрительных симтопом при вставке\выбросе оптических дисков.
ЗЫ:ганять в цикле по алфавиту GetDriveType как то не очень хочется.

Последний раз редактировалось _nic; 01.12.2008 в 23:06..
 
Ответить с цитированием

  #2  
Старый 02.12.2008, 03:00
0verbreaK
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
Провел на форуме:
379101

Репутация: 136
По умолчанию

Гоняй в цикле по алфавиту начиная с B по Z и не будет тарахтеть флопик
 
Ответить с цитированием

  #3  
Старый 02.12.2008, 05:33
noobyara
Новичок
Регистрация: 27.01.2008
Сообщений: 13
Провел на форуме:
210819

Репутация: 26
По умолчанию

Цитата:
Сообщение от _nic  
Как это сделать аккуратно?То есть что бы и флопик не тарахтел,и процессор излишне на слабых машинах не грузился ,и что бы не возникало никаких подозрительных симтопом при вставке\выбросе оптических дисков.
ЗЫ:ганять в цикле по алфавиту GetDriveType как то не очень хочется.
возможно стоит посмотреть в строну WMI и Win32_DeviceChangeEvent(да и других событий), только все это дело под XP и выше.
 
Ответить с цитированием

  #4  
Старый 02.12.2008, 11:34
neprovad
Постоянный
Регистрация: 19.10.2007
Сообщений: 794
Провел на форуме:
1013791

Репутация: 711


По умолчанию

Предыдущий автор прав. Копать в сторону событий.
http://msdn.microsoft.com/en-us/library/aa363205(VS.85).aspx

Последний раз редактировалось neprovad; 02.12.2008 в 11:38..
 
Ответить с цитированием

  #5  
Старый 02.12.2008, 17:37
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

Не совсем понял технологию.Это что надо перхватывать WindowProc и смотреть что там в uMsg ?
 
Ответить с цитированием

  #6  
Старый 02.12.2008, 18:03
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию

>> Это что надо перхватывать WindowProc и смотреть что там в uMsg ?

нет. вы регистрируете свой обработчик. и система его вызовет, котгда устройство будет присоединено

http://msdn.microsoft.com/en-us/library/aa363432(VS.85).aspx

Последний раз редактировалось 0x0c0de; 02.12.2008 в 18:06..
 
Ответить с цитированием

  #7  
Старый 02.12.2008, 23:02
_nic
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
Провел на форуме:
2982851

Репутация: 107


По умолчанию

ВОт нагуглил более простой пример чем на МСДН
Код:
#include <windows.h>
#include <iostream>
#include <dbt.h>

class CatchAll
{
public:
    LRESULT DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr);
    HWND    m_hwnd;
};

LRESULT CatchAll::DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr)
{
 BOOL fEvent = FALSE ;
 switch (event)
 {
  case DBT_DEVICEARRIVAL:
   printf("Begin");
   fEvent = TRUE ;
   break ;
  case DBT_DEVICEREMOVECOMPLETE:
   printf( "End");
   fEvent = TRUE ;
 }

 if (fEvent)
 {
  switch( pHdr->dbch_devicetype )
  {
   case DBT_DEVTYP_VOLUME:
    PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
            // do something...
            printf ("WM_DEVICECHANGE      hurra!!!");
            break;
        }
    }
    return 0;

}

LRESULT CALLBACK MessageLoopProc(HWND m_hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
    {
    CatchAll ca;
    switch ( Message )
        {
        case WM_DEVICECHANGE:
          MessageBox(m_hwnd,TEXT("Device changed"),TEXT("Sys message"),MB_OK);
            printf ("WM_DEVICECHANGE in MessageLoopProc!");
            ca.DeviceChange( wParam, (PDEV_BROADCAST_HDR)lParam);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(m_hwnd,Message,wParam,lParam);
        }

        return 0;

    }

int main()
{

    HINSTANCE hInst = GetModuleHandle(NULL);
    WNDCLASSEX  WndClass;
    HWND m_hwnd;

    char szClassName[] = "HiddenWindow";

    WndClass.cbSize = sizeof(WNDCLASSEX);
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc = /*(WNDPROC)*/MessageLoopProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInst;
    WndClass.hIcon = 0l;
    WndClass.hCursor = NULL;
    WndClass.hbrBackground = NULL;
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = szClassName;
    WndClass.hIconSm = 0l;

    RegisterClassEx(&WndClass);

    m_hwnd = CreateWindow(  szClassName, "Hidden Window",
                            WS_OVERLAPPEDWINDOW,
                            0,
                            0,
                            10,
                            10,
                            NULL,
                            NULL,
                            hInst,
                            NULL);
    ShowWindow(m_hwnd,SW_SHOW);         // SW_HIDE
    UpdateWindow(m_hwnd);


    MSG                 msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

/*  return CatchAll().MessageLoop();*/
    return 0;
}
только вот меня смущяет то что код хоть и выглядит гуевым но точка входа main Да и ещё непонятно почему мессагбокс вылазит раз 5 при вставке флешки.WM_DEVICECHANGE это что получается при вставке флэхи это событие происходит 5 раз подряд??

Последний раз редактировалось _nic; 02.12.2008 в 23:05..
 
Ответить с цитированием

  #8  
Старый 02.12.2008, 23:43
noobyara
Новичок
Регистрация: 27.01.2008
Сообщений: 13
Провел на форуме:
210819

Репутация: 26
По умолчанию

Цитата:
Сообщение от _nic  
ВОт нагуглил более простой пример чем на МСДН
Код:
#include <windows.h>
#include <iostream>
#include <dbt.h>

class CatchAll
{
public:
    LRESULT DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr);
    HWND    m_hwnd;
};

LRESULT CatchAll::DeviceChange(DWORD event, PDEV_BROADCAST_HDR pHdr)
{
 BOOL fEvent = FALSE ;
 switch (event)
 {
  case DBT_DEVICEARRIVAL:
   printf("Begin");
   fEvent = TRUE ;
   break ;
  case DBT_DEVICEREMOVECOMPLETE:
   printf( "End");
   fEvent = TRUE ;
 }

 if (fEvent)
 {
  switch( pHdr->dbch_devicetype )
  {
   case DBT_DEVTYP_VOLUME:
    PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
            // do something...
            printf ("WM_DEVICECHANGE      hurra!!!");
            break;
        }
    }
    return 0;

}

LRESULT CALLBACK MessageLoopProc(HWND m_hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
    {
    CatchAll ca;
    switch ( Message )
        {
        case WM_DEVICECHANGE:
          MessageBox(m_hwnd,TEXT("Device changed"),TEXT("Sys message"),MB_OK);
            printf ("WM_DEVICECHANGE in MessageLoopProc!");
            ca.DeviceChange( wParam, (PDEV_BROADCAST_HDR)lParam);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(m_hwnd,Message,wParam,lParam);
        }

        return 0;

    }

int main()
{

    HINSTANCE hInst = GetModuleHandle(NULL);
    WNDCLASSEX  WndClass;
    HWND m_hwnd;

    char szClassName[] = "HiddenWindow";

    WndClass.cbSize = sizeof(WNDCLASSEX);
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    WndClass.lpfnWndProc = /*(WNDPROC)*/MessageLoopProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInst;
    WndClass.hIcon = 0l;
    WndClass.hCursor = NULL;
    WndClass.hbrBackground = NULL;
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = szClassName;
    WndClass.hIconSm = 0l;

    RegisterClassEx(&WndClass);

    m_hwnd = CreateWindow(  szClassName, "Hidden Window",
                            WS_OVERLAPPEDWINDOW,
                            0,
                            0,
                            10,
                            10,
                            NULL,
                            NULL,
                            hInst,
                            NULL);
    ShowWindow(m_hwnd,SW_SHOW);         // SW_HIDE
    UpdateWindow(m_hwnd);


    MSG                 msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

/*  return CatchAll().MessageLoop();*/
    return 0;
}
только вот меня смущяет то что код хоть и выглядит гуевым но точка входа main Да и ещё непонятно почему мессагбокс вылазит раз 5 при вставке флешки.WM_DEVICECHANGE это что получается при вставке флэхи это событие происходит 5 раз подряд??
да хоть nepohek назови главное указать это в параметрах линкера,флаг SUBSYSTEM отвечает за тип приложения (например /SUBSYSTEM:CONSOLE) и флаг ENTRY за точку входа(/ENTRY:"nepohek"). в студии это можно сделать через опции проекта( Linker->System->SubSystem b Linker->Advanced->Entry Point)
 
Ответить с цитированием

  #9  
Старый 03.12.2008, 06:08
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию

Цитата:
да хоть nepohek назови главное указать это в параметрах линкера,флаг SUBSYSTEM отвечает за тип приложения (например /SUBSYSTEM:CONSOLE) и флаг ENTRY за точку входа(/ENTRY:"nepohek"). в студии это можно сделать через опции проекта( Linker->System->SubSystem b Linker->Advanced->Entry Point)
Или в самом коде...

#pragma comment(linker,"/ENTRY:main")

и

#pragma comment(linker,"/SUBSYSTEM:CONSOLE")
 
Ответить с цитированием

  #10  
Старый 03.12.2008, 20:27
neprovad
Постоянный
Регистрация: 19.10.2007
Сообщений: 794
Провел на форуме:
1013791

Репутация: 711


По умолчанию

все верно что 5 раз, просто из всего этого изобилия надо выбрать все что попадает под event = DBT_DEVICEARRIVAL
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как стать хакером! foreva Болталка 19 12.12.2007 00:12
Как использовать cross-site scripting (css) foreva Чужие Статьи 0 06.02.2005 19:03



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ