Войти

Показать полную графическую версию : Подскажите, как реализовать программу (С++)


azotvp
25-03-2011, 14:15
хочу реализовать программу которая должна:
1) небольшие системные файлы переносить из одной папки в другую
2) определять уникальный идентификатор Flash-накопителя VID
3) производить поиск в реестре и удалять нужные файлы

желательны советы по реализации данных трёх пунктов на C++, можно с ссылкой на литературу
если знаете, как реализовать данные функции на других языках (delphi i t.d) также прошу поделиться

заранее спасибо

Beyound
25-03-2011, 16:57
начнем с простого - п 3. есть отдельный стандартный класс для работы с реестром винды, находится в библиотеке windows.h, подробнее - тут (http://www.vr-online.ru/content/s-rabotaem-s-reestrom-3235)
п.1. системный файл не отличается от обычного файла ничем, просто иногда нужны права админа чтобы его двигать. Опять же в winAPI, таже библиотека, есть стандартные функции на эту тему, подробнее ну скажем тут (http://www.yworld.ru/forum/index.php?topic=1081) неплохо все расписано
п.2. для работы с usb тоже скорее всего есть в winAPI чтонить типа перечислителя подключенных устройств, подробнее не скажу, такое не делал а искать лень уже.

azotvp
25-03-2011, 17:54
большое спасибо за 1 и 3 пункты, информация помогла для того чтобы начать реализовывать задуманное

если у кого-нибудь есть еще идеи по поводу реализации пункта 2 - определения vid накопителя, прошу поделиться =)

BlackEric
26-03-2011, 00:06
Информацию о железе можно получать через WMI (http://msdn.microsoft.com/en-us/library/aa394582%28v=VS.85%29.aspx)
или можете попробовать разобраться с функцией DeviceIoControl.

azotvp
26-03-2011, 09:09
может есть у кого готовый листинг проги, которая определяет серийный номер Флешки?

BlackEric
26-03-2011, 15:34
Я так понимаю, что вы хотите отследить кто, что подключал к компьютеру.

Я бы делал так:
1. Обработал событие message WM_DEVICECHANGE и таким образом узнал, что подключено.
Примеры обработки есть на диске к книге Агурова (DeviceMonitor.Delphi).

2. Если это логический диск, то через WMI из класса Win32_DiskDrive получил интересующие вас Caption и PNPDeviceID.


procedure TForm1.GetAllMediaData;
var
SWbemLocator: TSWbemLocator;
Service: ISWbemServices;
DiskDrives, SWbemObjectSet: ISWbemObjectSet;
SWbemObject: ISWbemObject;
PropSet: ISWbemPropertySet;
DriveEnum: IEnumVariant;
Value: Cardinal;
TempObj: OleVariant;
begin
Memo1.Lines.Add('======================');

SWbemLocator := TSWbemLocator.Create(Nil);
try
Service := SWbemLocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0,
Nil);
DiskDrives := Service.ExecQuery(
'SELECT * FROM Win32_DiskDrive', 'WQL', 0, Nil);

DriveEnum := (DiskDrives._NewEnum) as IEnumVariant;
while DriveEnum.Next(1, TempObj, Value) = S_OK do
begin
SWbemObject := IUnknown(TempObj) as ISWbemObject;
PropSet := SWbemObject.Properties_;

if PropSet.Count > 0 then
try
Memo1.Lines.Add('======================');
Memo1.Lines.Add('DeviceID = ' + PropSet.Item('DeviceID', 0).Get_Value);
Memo1.Lines.Add('SerialNumber = ' + PropSet.Item('SerialNumber', 0).Get_Value);
Memo1.Lines.Add('Caption = ' + PropSet.Item('Caption', 0).Get_Value);
Memo1.Lines.Add('Size = ' + IntToStr(PropSet.Item('Size', 0).Get_Value));
Memo1.Lines.Add('InterfaceType = ' + PropSet.Item('InterfaceType', 0).Get_Value);
Memo1.Lines.Add('Manufacturer = ' + PropSet.Item('Manufacturer', 0).Get_Value);
Memo1.Lines.Add('Model = ' + PropSet.Item('Model', 0).Get_Value);
Memo1.Lines.Add('Name = ' + PropSet.Item('Name', 0).Get_Value);
Memo1.Lines.Add('PNPDeviceID = ' + PropSet.Item('PNPDeviceID', 0).Get_Value);
Memo1.Lines.Add(' ');
except

end;

end;
finally
SWbemLocator.Free;
Memo1.Lines.Add('======================');
end;
end;

azotvp
26-03-2011, 15:59
я пытаюсь сделать блокиратор флэшек
суть:
флешки, которые ранее подключались, работают нормально без какх - либо изменений.
а те, которые ранее не подключались - блокируются.

для этого мне и нужно определить серийный номер, и благодаря ему добавлять флешки в разрешенные устройства, и по этому номеру производить очистку реестра.

сейчас нашел 2 API – функции: GetDriveType – определяет и возвращает тип носителя,
GetVolumeInformation – определяет информацию о носителе, среди которой содержится серийный номер

надеюсь я иду в верном направлении
п.с. по прежнему буду благодарен за помощь =)

BlackEric
26-03-2011, 16:29
Серийник возвращаемый GetVolumeInformation - является серийником логического диска и меняется после каждого форматирования.

Так же не забудьте протестировать решение на телефоне, который определяется как флешка.
Там может не все корректно отработать.

А как вы собрались блокировать флешку?

azotvp
26-03-2011, 16:56
походу GetVolumeInformation не подходит =(
есть программа checkUDisk v5.3 - она определяет параметры подключенных дисков, веси около 200 кб, среди параметров
Serial Number: P7XO8HVXRYF9M6NL - есть то что нужно, узнать бы по какому принципу она пашет

а по поводу вопроса, как блокировать флешки:
в папке %systemroot% / inf есть 2 системных файла usbstor.PNF и usbstor.inf
при удалении этих файлов/перемещении, ос перестает опознавать любые носители которые ранее не подключались
просто появляется сообщение: устройство не опознано и все, оно даже в диспетчере устройств не отобразится
внимание: заблокированные флешки даже после возврата файлов на место не опознаются (покачто решения проблемы не нашел) любые другие флешки, которые не были заблокированы, после возврата файлов на место работают корректно.

получается так: если вы удалите эти 2 файла usbstor.PNF и usbstor.inf - то работать будут только те флешки, информация о которых есть в реестре.
если же вам нужно исключить одну из флешек, которой "разрешен доступ", то просто необходимо очистить все записи в реестре о ней. Очистку лучше производить по серийнику)
делал все что я описал руками - все работает, хочу лишь чтобы все было цивиьно и выполнялось программой, и мог любой не просвещенный выполнить данную процедуру

вродебы рассказал все что нужно знать для реализации такой программы.
проблема остается в том, чтобы определить этот злосчастный серийный номер

BlackEric
27-03-2011, 00:06
Ну так получите через WMI PNPDeviceID = USBSTOR\DISK&VEN_JETFLASH&PROD_TS512MJF110&REV_0.00\68E739268F4717&0
и распарсите его выдрав серийник




© OSzone.net 2001-2012