purebasic.info

PureBasic forum
Текущее время: Пт июн 22, 2018 12:35 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Аналог InpOut32 на PureBasic
СообщениеДобавлено: Вс фев 12, 2012 8:46 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11186
Благодарил (а): 4 раз.
Поблагодарили: 415 раз.
Если кто не знает, InpOut32.dll это такая либа, которая позволяет получить доступ к портам в NT системах, в которых для прог, работающих на третьем кольце безопасности, запрещены инструкции, типа In и Out. Эти инструкции разрешены на нулевом кольце безопасности, на котором работают драйверы, ядро системы и т. д.
InpOut32.dll это своеобразная прослойка между программой и драйвером.

Она имеет несложную конструкцию и ее, а также драйвер (благодарим puremaster'а за инструменты и Fox'а, за DDK), мы можем написать на PureBasic.

Собственно код DLL.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#Driver =  "pbio";"pbiodriver"
Global hDriverID
 
Procedure.s SysDir()
  Protected Result.s=""
  *mem = AllocateMemory(#MAX_PATH)
  If *mem
    Len=GetSystemDirectory_(*mem, #MAX_PATH)
    If Len>0
      Result=PeekS(*mem, Len)
    EndIf
    FreeMemory(*mem)
  EndIf
  ProcedureReturn Result
EndProcedure
 
Procedure Driver_Start(Drivers_Name.s)
  Protected hSCManager.l, hServ.l, Result
  Result=#False
  hSCManager  = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
  If hSCManager = 0
    If GetLastError_() = #ERROR_ACCESS_DENIED
      hSCManager  = OpenSCManager_(#Null, #Null, #GENERIC_READ)
      hServ       = OpenService_(hSCManager, Drivers_Name, #GENERIC_EXECUTE)
      If StartService_(hServ, 0, #Null)
        Result=#True
      EndIf
    EndIf
   
  Else
    hServ       = OpenService_(hSCManager, Drivers_Name, #GENERIC_EXECUTE)
    If StartService_(hServ, 0, #Null)
      Result=#True  
    Else
      ErrorCode=GetLastError_()
      If ErrorCode=1056
        Result=#True
      EndIf
    EndIf
  EndIf
 
  CloseServiceHandle_(hServ)
  CloseServiceHandle_(hSCManager)
 
  ProcedureReturn Result
EndProcedure
 
 
Procedure Driver_UnInstall(Drivers_Name.s)
  Protected ServiceStatus.SERVICE_STATUS
  hSCManager  = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
  hServ       = OpenService_(hSCManager, Drivers_Name, #SERVICE_ALL_ACCESS)
 
  If hServ<>#Null
    ControlService=ControlService_(hServ, #SERVICE_CONTROL_STOP, @ServiceStatus)
    ;If ControlService<>#Null
     DeleteService_(hServ)
    ;EndIf
  EndIf
 
  CloseServiceHandle_(hServ)
  CloseServiceHandle_(hSCManager)
EndProcedure
 
Procedure Driver_Install(Drivers_Name.s)
  Protected Result, FileID, File.s, Mgr, Ser, Count
  Result=#False
  Count=0
  File=SysDir()+"\drivers\"+Drivers_Name+".sys"
 
  FileID=CreateFile(#PB_Any, File)
  If FileID
    WriteData(FileID, ?Driver, ?DriverEnd-?Driver)
    CloseFile(FileID)
   
    Driver_Install_M1:
   Mgr = OpenSCManager_(#Null, #Null, #SC_MANAGER_ALL_ACCESS)
    If Mgr
      Ser = CreateService_(Mgr, Drivers_Name, Drivers_Name, #SERVICE_ALL_ACCESS, #SERVICE_KERNEL_DRIVER, #SERVICE_SYSTEM_START, #SERVICE_ERROR_NORMAL, File, #Null, 0, 0, 0, 0)
      ErrorCode=GetLastError_()
      If Ser
        Result=#True
      ElseIf ErrorCode=1073
        Result=#True
      ElseIf ErrorCode=1072
        If Count=0
         
          CloseServiceHandle_(Ser)
          CloseServiceHandle_(Mgr)
          Driver_UnInstall(Drivers_Name)
          Count+1
          Goto Driver_Install_M1
        EndIf
      EndIf
    EndIf
  EndIf
 
  CloseServiceHandle_(Ser)
        CloseServiceHandle_(Mgr)
 
  ProcedureReturn Result
 
  DataSection
    Driver:
   IncludeBinary "pbio.sys"
    DriverEnd:
 EndDataSection
EndProcedure
 
Procedure OpenDriver()
  Protected Result, hDriver
  Result=0
 
  hDriver = CreateFile_("\\.\"+#Driver, #GENERIC_READ | #GENERIC_WRITE, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
  If hDriver=#INVALID_HANDLE_VALUE
    If Driver_Install(#Driver)
      If Driver_Start(#Driver)
        hDriver = CreateFile_("\\.\"+#Driver, #GENERIC_READ | #GENERIC_WRITE, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
        If hDriver <> #INVALID_HANDLE_VALUE
          Result=hDriver
        EndIf
      EndIf
    EndIf
  Else
    Result=hDriver
  EndIf
 
  ProcedureReturn Result
EndProcedure
 
ProcedureDLL AttachProcess(Instance)
  hDriverID = OpenDriver()
EndProcedure
 
ProcedureDLL DetachProcess(Instance)
  If hDriverID
    CloseHandle_(hDriverID)
    hDriverID=0
  EndIf
EndProcedure
 
#IOCTL_READ_PORT_UCHAR   = $200
#IOCTL_WRITE_PORT_UCHAR  = $400
 
ProcedureDLL Inp32(PortAddress.u)
  Protected Result, Buffer.l, BytesReturned.l
  Result=0
 
  If hDriverID
    Buffer=PortAddress
    DeviceIoControl_(hDriverID, #IOCTL_READ_PORT_UCHAR, @Buffer, 2, @Buffer, 1, @BytesReturned, 0)
    Result=Buffer-768
  EndIf
 
  ProcedureReturn Result
EndProcedure
 
ProcedureDLL Out32(PortAddress.u, Infa.a)
  Protected Result, Buffer.l, BytesReturned.l
  Result=0
 
  If hDriverID
    Buffer=PortAddress
    PokeA(@Buffer+2, Infa)
    DeviceIoControl_(hDriverID, #IOCTL_WRITE_PORT_UCHAR, @Buffer, 3, 0, 0, @BytesReturned, 0)
  EndIf
 
  ProcedureReturn Result
EndProcedure
 

Код драйвера для прямой записи в порты компа.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
Declare DriverEntry(*DriverObject, *RegistryPath)
 
!public PureBasicStart
!section '.code' code readable executable align 8
!PureBasicStart:
*A=@DriverEntry()
!jmp [p_A]
 
Import "ntoskrnl.lib"
  IoCompleteRequest(*IRP, PriorityBoost)
  RtlInitUnicodeString(*UString, *String)
  IoCreateDevice(*DriverObject, DeviceExtensionSize, *UDeviceName, DeviceType, DeviceCharacteristics, Exclusive, *DeviceObject)
  IoDeleteDevice(*DeviceObject)
  IoCreateSymbolicLink(*SymbolicLinkName, *DeviceName)
  IoDeleteSymbolicLink(*SymbolicLinkName)
EndImport
 
; ImportC "ntoskrnl.lib"
;       DbgPrint(a.s)
; EndImport
 
 
IncludeFile "..\..\DDK.pbi" ;PB_DDK_WinXP.pbi
 
#IOCTL_READ_PORT_UCHAR   = $200
#IOCTL_WRITE_PORT_UCHAR  = $400
 
Procedure.b InPort(Port.u)
 Protected Result.b=0
 EnableASM
 MOV DX, Port
 IN al,DX
 MOV Result, al
 DisableASM
ProcedureReturn Result
EndProcedure
 
Procedure OutPort(Port.u, Byte.a)
 EnableASM
 MOV al, Byte
 MOV DX, Port
 OUT DX, al
 DisableASM
EndProcedure
 
Procedure DeviceIoControl(*DeviceObject.DEVICE_OBJECT, *pIrp._IRP)
  Protected ntStatus
  *stkloc.IO_STACK_LOCATION = @*pIrp\Tail\Overlay\CurrentStackLocation;*pIrp\Tail\Overlay\CurrentStackLocation
  inBuffersize = PeekL(*pIrp\Tail\Overlay\CurrentStackLocation+8) ;*stkloc\InputBufferLength02 ;Parameters\DeviceIoControl\InputBufferLength
  outBuffersize = PeekL(*pIrp\Tail\Overlay\CurrentStackLocation+4);*stkloc\OutputBufferLength02 ;Parameters\DeviceIoControl\OutputBufferLength
  CtrlBuff   = PeekL(*pIrp\SystemBuffer) ;AssociatedIrp\SystemBuffer
  address = CtrlBuff & $FFFF
  Infa    = (CtrlBuff>>16)&255
  Code = PeekL(*pIrp\Tail\Overlay\CurrentStackLocation+12)
  Select Code ;*stkloc\IoControlCode ;Parameters\DeviceIoControl\IoControlCode
    Case #IOCTL_READ_PORT_UCHAR
      InByte.b=InPort(address)
      PokeL(*pIrp\SystemBuffer, InByte)
      *pIrp\IoStatus\Information = 1
      ;DbgPrint("IOCTL_READ_PORT_UCHAR")
    Case #IOCTL_WRITE_PORT_UCHAR
      OutPort(address, Infa)
      ;DbgPrint("IOCTL_WRITE_PORT_UCHAR")
      *pIrp\IoStatus\Information = 10
    Default
      ntStatus = #STATUS_SUCCESS ;#STATUS_UNSUCCESSFUL
      *pIrp\IoStatus\Information = 0
  EndSelect
 
  ntStatus = #STATUS_SUCCESS
 
  *pIrp\IoStatus\Status = ntStatus
  IoCompleteRequest(*pIrp, #IO_NO_INCREMENT)
 
  ProcedureReturn ntStatus
EndProcedure
 
Procedure CreateDispatch(*DeviceObject.DEVICE_OBJECT, *pIrp._IRP)
  *pIrp\IoStatus\Information = 0
  *pIrp\IoStatus\Status = #STATUS_SUCCESS
  IoCompleteRequest(*pIrp, #IO_NO_INCREMENT)
  ;Irp
  ProcedureReturn #STATUS_SUCCESS
EndProcedure
 
Procedure UnloadDriver(*DriverObject.DRIVER_OBJECT)
  Protected uniDOSString.UNICODE_STRING
  ;DbgPrint("UnloadDriver")
  RtlInitUnicodeString(@uniDOSString, ?DosDevices)
  IoDeleteSymbolicLink (@uniDOSString)
  IoDeleteDevice(*DriverObject\DeviceObject)
EndProcedure
 
 
Procedure DriverEntry(*DriverObject.DRIVER_OBJECT, *RegistryPath.UNICODE_STRING)
  Protected deviceObject.DEVICE_OBJECT
  Protected uniNameString.UNICODE_STRING
  Protected uniDOSString.UNICODE_STRING
  ; DbgPrint("DriverEntry")
  RtlInitUnicodeString(@uniNameString, ?Device)
  RtlInitUnicodeString(@uniDOSString, ?DosDevices)
  status = IoCreateDevice(*DriverObject, 0, @uniNameString, #FILE_DEVICE_UNKNOWN, 0, #False, @deviceObject)
  If status <> #STATUS_SUCCESS
    ProcedureReturn status
  EndIf
 
  status = IoCreateSymbolicLink(@uniDOSString, @uniNameString)
  If status <> #STATUS_SUCCESS
    ProcedureReturn status
  EndIf
 
        *DriverObject\DriverUnload = @UnloadDriver()
       
        *DriverObject\MajorFunction[#IRP_MJ_CREATE] = @CreateDispatch()
        *DriverObject\MajorFunction[#IRP_MJ_DEVICE_CONTROL] = @DeviceIoControl()
       
        ProcedureReturn #STATUS_SUCCESS
EndProcedure
 
!extrn PB_PeekL
!extrn PB_PokeL
;!extrn _DbgPrint
!extrn _IoCompleteRequest@8
!extrn _RtlInitUnicodeString@8
!extrn _IoCreateDevice@28
!extrn _IoDeleteDevice@4
!extrn _IoCreateSymbolicLink@8
!extrn _IoDeleteSymbolicLink@4
 
 
 
;
DataSection
 
  ; \Device\pbio
  Device:
 Data.a $5C, $00, $44, $00, $65, $00, $76, $00, $69, $00
  Data.a $63, $00, $65, $00, $5C, $00, $70, $00, $62, $00
  Data.a $69, $00, $6F, $00, $00, 0
 
 
  ; \DosDevices\pbio
  DosDevices:
 Data.a $5C, $00, $44, $00, $6F, $00, $73, $00, $44, $00
  Data.a $65, $00, $76, $00, $69, $00, $63, $00, $65, $00
  Data.a $73, $00, $5C, $00, $70, $00, $62, $00, $69, $00
  Data.a $6F, $00, $00, 0
  ;Data
EndDataSection


Примеры использования во вложении.

PS.
InpOut32.dll весит 30 КБ, а моя DLL, при аналогичной функциональности, 10 КБ. :D :wink:

PSS.
Тестировал на ХРюше.


Вложения:
pb_io.rar [56.13 KiB]
Скачиваний: 343

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 13, 2012 5:40 am 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Петя, ты крут! :)
winXP полет нормальный. Единственно что заметил, драйвер не выгружается/не останавливается после завершения проги, ну и не унрегистрируется. Хотя второе не обязательно, учитывая что ты копируешь дров в системную папку drivers (зачем?) можно запись оставить, а то странно - дров есть, а записи нет :D

Еще так как peeks() и прочие строковые функции нифига не работают, статичные юникодные строки я бы вводил так:
Цитата:
DataSection

Device:
!du '\Device\pbio', 0, 0

DosDevices:
!du '\DosDevices\pbio', 0, 0

EndDataSection


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 13, 2012 8:30 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Зачет

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 13, 2012 11:14 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11186
Благодарил (а): 4 раз.
Поблагодарили: 415 раз.
puremaster писал(а):
Единственно что заметил, драйвер не выгружается/не останавливается после завершения проги
В коде есть процедура выгрузки драйвера но она работает криво. Первый ее вызов, не удаляет службу, а только подготавливает к удалению, а второй уже удаляет.
И кстати, InpOut32.dll тоже не выгружает дров.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 13, 2012 10:02 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр
Цитата:
для прог, работающих на третьем кольце безопасности, запрещены инструкции, типа In и Out. Эти инструкции разрешены на нулевом кольце безопасности

На самом деле возможность исполнения I/O определяется не только модом, но и есчо IOPL и IOPM. Если CPL <= IOPL, то такие инструкции исполняются, иначе генерится #GP. Сюда относятся есчо и Cli, Sti. В юзермоде можно запретить прерывания =)

Далее на младших версиях системы (XP) имеется сервис, который позволяет поднять права ввода-вывода. Это ProcessUserModeIOPL. Всего один сервис и юзайте на здоровье порты. Только это плохую совместимость имеет.

_________________
Materia Lucida


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 15, 2012 11:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11186
Благодарил (а): 4 раз.
Поблагодарили: 415 раз.
Сделал либу для пурика (для 4.60) из этого кода.


Вложения:
PB_IO_4.60.rar [14.47 KiB]
Скачиваний: 296

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 24, 2012 3:33 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11186
Благодарил (а): 4 раз.
Поблагодарили: 415 раз.
Новая версия DLL.
В отличие от предыдущей, исправлены некоторые моменты (не фатальные), к примеру, теперь драйвер извлекается во временную папку, что позволяет успешно его использовать даже под учеткой с ограниченными правами.

puremaster писал(а):
статичные юникодные строки я бы вводил так
Не все так просто. На такую запись ругается.
Код:
1
2
3
4
5
  Device:
 !du '\Device\pbdriverio', 0, 0
 
  DosDevices:
 !du '\DosDevices\pbdriverio', 0, 0

Но если сократить длину строки, то нормально компилируется. Причем достаточно сократить длину только одной из строк. Видимо есть какие ограничения.


Вложения:
PB_IO.rar [10.19 KiB]
Скачиваний: 290

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 04, 2013 5:54 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11186
Благодарил (а): 4 раз.
Поблагодарили: 415 раз.
Оформил код в виде модуля с подобием ООП. См. вложение. Поддерживаются 32 и 64 битные системы.

Запись в порт LPT 1 и чтение из него.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
XIncludeFile "PortIO.pbi"
 
*Port.PortIO::PortIO = PortIO::New()
 
Debug *Port
 
If *Port
 
  Select *Port\Status()
    Case PortIO::#Status_OK
      Debug "OK"
    Case PortIO::#Status_ErrCopyDriver
      Debug "Error Copy Driver"
    Case PortIO::#Status_ErrInstallDriver
      Debug "Error Install Driver"
    Case PortIO::#Status_ErrAccess
      Debug "Error Access Driver"
  EndSelect
   
  Debug *Port\DriverID()
 
  *Port\SetByte($378, 100)
  Debug *Port\GetByte($378)
 
  *Port\Free()
 
EndIf

Так же работа с LPT портом.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
XIncludeFile "PortIO.pbi"
 
Procedure SendLPT1(*Port.PortIO::PortIO)  ; Процедура передачи данных в LPT1
  Send.a=0
  For i=8 To 1 Step -1    ; В цикле сканируются "флажки" (CheckBoxGadget) отвечающие за пины порта
    If GetGadgetState(i)=1  ; Определяем состояние "флажка"
      Send | 1                   ; Операция "Логическое ИЛИ"
    Else
      Send & %11111110       ; Операция "Логическое И"
    EndIf
    If i>1
      Send << 1                 ; Сдвиг переменной на 1 бит влево
    EndIf
  Next i        
  *Port\SetByte($378, Send)         ; Данные в LPT1
EndProcedure
 
 
*Port.PortIO::PortIO = PortIO::New()
If *Port
 
  Err = *Port\Status()
  If Err<>PortIO::#Status_OK
    MessageRequester("", "Ошибка драйвера "+Str(Err))
  EndIf
 
  ; Открываем окно
  OpenWindow(0,0,0,120,240,"lpt Pin", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)  
  Frame3DGadget(#PB_Any,20,10,80,180,"Pins")
  y=28
  For i=1 To 8
    CheckBoxGadget(i,36,y,50,16,"Pin "+Str(i)) ; "флажки"
    y+20
  Next i
  ButtonGadget(9,6,210,110,24,"Отправить в LPT 1") ; Экранная кнопка
  HideWindow(0,0)   ; Отображение окна на экране
 
  Repeat         ; Главный (оконный) цикл программы "Repeat - Until"
    Event=WaitWindowEvent()  ; Идентификатор события
    If Event=#PB_Event_Gadget ; Произошло событие в гаджете
      Gadget=EventGadget()    ; ID гаджета, в котором произошло событие
      If Gadget=9             ; Обнаруден клик по экранной кнопке
        SendLPT1(*Port)            ; Процедура передачи информации по порт LPT1
      EndIf
    EndIf
  Until Event=#PB_Event_CloseWindow ; Когда закрывают окно, цикл будет прерван и прога завершит работу.
 
  *Port\Free()
 
EndIf

Измерение температуры процессора и чипсета.
Будет работать не на всех компах из-за аппаратных особенностей.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ADR_REG = $295 ;Это адреса регистров системной платы, с помощью которых можно узнать температуру
#DATA_REG = $296
 
XIncludeFile "PortIO.pbi"
 
Procedure Termo(*Port.PortIO::PortIO) ; Эта процедура вызывается по таймеру каждую секунду
  *Port\SetByte(#ADR_REG, $2B) ; Получает текущую температуру процессора
  x=*Port\GetByte(#DATA_REG)
  SetGadgetItemText(0,0,StrU(x, #PB_Byte)+" °C",1) ; отображаем её в таблице
 
  *Port\SetByte(#ADR_REG, $29) ; Получает текущую температуру системной платы
  x=*Port\GetByte(#DATA_REG)
  SetGadgetItemText(0,1,StrU(x, #PB_Byte)+" °C",1)  ; отображаем её в таблице
EndProcedure
 
 
*Port.PortIO::PortIO = PortIO::New()
If *Port
 
  Err = *Port\Status()
  If Err<>PortIO::#Status_OK
    MessageRequester("", "Ошибка драйвера "+Str(Err))
  EndIf
 
  OpenWindow(0,0,0,274,80,"TermoControl",#PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered)
 
  ListIconGadget(0,2,4,270,70,"Имя",120,#PB_ListIcon_GridLines) ; Таблица
  SetGadgetFont(0,LoadFont(0,"MS Sans Serif",10) ) ; Шрифт используемый в таблице
  AddGadgetColumn(0, 1, "Температура", 140) ; Добавление колонки в таблицу
  AddGadgetItem(0, 0, "Процессор") ; Добавление строк в таблицу
  AddGadgetItem(0, 1, "Мат. плата")
 
  Termo(*Port)
  AddWindowTimer(0,2,1000) ; Таймер.
 
  HideWindow(0,0) ; Отображение окна
 
  Repeat ; Главный цикл программы
    Event=WaitWindowEvent()
    If Event=#PB_Event_Timer
      Termo(*Port)
    EndIf
  Until Event=#PB_Event_CloseWindow
 
  *Port\Free()
 
EndIf



Вложения:
Комментарий к файлу: Модуль для работы с портами компа.
PortIO_Module.zip [5.89 KiB]
Скачиваний: 237

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июл 08, 2013 10:39 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Пётр
Спасибо

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июл 08, 2013 10:42 am 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Ух ты, как то даже этот код не заметил :oops: Спасибо!

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Аналог InpOut32 на PureBasic
СообщениеДобавлено: Вт мар 11, 2014 9:15 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11186
Благодарил (а): 4 раз.
Поблагодарили: 415 раз.
Часть сообщений было перемещено в тему Цветомузыка.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB