вторник, 13 февраля 2018 г.

Как написать простой драйвер в Linux?

Как написать простой драйвер в Linux?

/* Заголовочные файлы */
#include <linux/init.h>
#include <linux/module.h>
/* Загрузка драйвера */
static int driver_init(void)
{
  printk(KERN_ALERT "Driver Loaded!\r\n");
  return 0;
}
/* Выгрузка драйвера*/
static void driver_unload(void)
{
  printk(KERN_ALERT "Driver Unloaded!\r\n");
}
/* Инициализация call-back на функционал */
module_init(driver_init);
module_exit(driver_unload);

можно заметить что программирование драйверов под Linux,
похоже с программирование драйверов под Windows, похоже тем, что используются все те же call-back механизмы...

###
назовем этот файл main.c

###
Создаем файл Makefile (Будьте внимательные к регистру, для make - это чувствительно!) nano Makefile
т.к у нас модуль называется main.c

среда, 24 мая 2017 г.

VPN WINAPI | Создание VPN соединения средствами WINAPI

#include <stdio.h>
#include <windows.h>
#include <strsafe.h>

#include <ras.h>
#include <raserror.h>

#include <string.h>
#include <winbase.h>
#include <time.h>
#include <stddef.h>
#include <stdlib.h>
#pragma comment(lib, "rasapi32.lib")

int main(void)
{
HRASCONN hConnection = NULL;
RASDIALPARAMSW RasDialParams;
memset (&RasDialParams, 0, sizeof (RasDialParams));
// Configure the RASDIALPARAMS structure.
RasDialParams.dwSize = sizeof (RasDialParams);
RasDialParams.szPhoneNumber[0] = TEXT('\0');
RasDialParams.szCallbackNumber[0] = TEXT('\0');
wsprintfW(RasDialParams.szEntryName, L"%s", L"test");
wsprintfW(RasDialParams.szUserName, L"%s",  L"test");
wsprintfW(RasDialParams.szPassword, L"%s",  L"test");
wsprintfW (RasDialParams.szDomain, L"%s", L"\0"); //This is optional

воскресенье, 14 мая 2017 г.

MSSQL Сервер база перешла в подозрительное состояние SUSPECT


Выполнить скрипт.

ALTER DATABASE [BD_NAME] SET EMERGENCY
GO
ALTER DATABASE [BD_NAME] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC CHECKDB ('BD_NAME', REPAIR_ALLOW_DATA_LOSS)
GO
ALTER DATABASE [BD_NAME] SET MULTI_USER
GO

вторник, 21 февраля 2017 г.

Мониторинг вашего сервера на стабильность.

        Иногда требуется получить уведомление если один из серверов перестает быть доступен. Уведомление будет отсылаться на e-mail. Алгоритм работы скрипта который мониторит ваши сервера будем реализовывать на perl. И так у нас есть список серверов. Мы прогибаемся по этому списку раз в 10 минут(список состоит из ip + port) на который можно присоединится с помощью telnet. Если соединится по telnet не удается отправляем письмо на почту, мол такой сервер перестал быть доступен. Первое что требуется это установить perl, далее после того как perl поставлен можно открыть cmd/terminal набрать следующее : 

cpan Net::SMTP::TLS;
cpan Net::SMTP::SSL;
cpan Net::Telnet;

#Собственно сам скрипт.
use strict;
use warnings;
use Net::Telnet;
use 5.010;
use Net::SMTP::TLS;
use Net::SMTP::SSL;
 
#Создать список серверов для проверки.
#Если сервер в течении 10 минут не отвечает, отправить письмо на e-mail, в теме #письма указать сервер который не отвечает.
my $user = 'MyRuMailUser'; //Пользователь
my $pass = 'MyRuMailPassword'; //Пароль от ящика.
my $server     = 'smtp.mail.ru';
my $to         = 'mymonitorserver@gmail.com';
my $from_name  = 'MyRuMailUser@mail.ru';
my $from_email = 'MyRuMailUser@mail.ru';

воскресенье, 15 января 2017 г.

SQLITE регистр для LIKE

SQLITE не учитывает регистр для оператора LIKE для русских символов.
Например у вас в базе есть, некоторое значение "тестовая строка";
Если вы напишите такой код : SELECT * FROM FOO WHERE str LIKE('%Тестовая строка');
результат запроса будет - 0;
Известные решения:

  1. Использовать расширение, которое уже есть стандартно - FTS3. Создание специальных виртуальных таблиц с поддержкой поиска и использование оператора MATCH
  2. Создать в вашей таблице еще один столбец(нормализованный), который будет содержать ту же инфу по которой вам нужно провести поиск, только в верхнем(или нижнем) регистре и делать LIKE по этому столбцу, но результат возвращать по обычному столбцу

среда, 23 ноября 2016 г.

Ассемблер чтение числа с консоли & вывод числа на консоль.

В ассемблере(DOS/TASM)  функция 01h 21 - ого прерывания читает только один символ за раз.
Чтобы перевести символ в число, надо отнять 30h ( scan code = al - 30h).
Что делать если надо прочитать число где количество разрядов больше 1, например : 123. ?
Алгоритм преобразования следующий 
1) Result = 0;
2) Result *= 10;
3) Result += C;
 где C - целое число без знака.

READ PROC

  mov ax, 0            ; Загрузить 0 в регистра AX
  mov xResult, ax  ; Установить 0 в Результат.
  mov cx, 1            ; Разряды в числе, то есть число не больше 1-9, если нужно 0..99, то надо 2...
  @:
  mov bx, 10           ;Основание системы 10-тичная
  mov ah, 01h         ; Функция чтения символа.
  int  21h                 ; Вызов прерывания
  cmp  al, 13            ; Если это пробел?
  je @                      ; Повторяем чтение.
  sub  al, 30h           ; Переводим символ в число.
  mov  ah, 0             ; Старшая часть числа  установим в 0
  push ax                  ;  Сохранить
  mov  ax, xResult   ; Загрузить результат в AX
  mul  bx                  ; Умножить AX на основание системы 10-тиричная
  pop  bx                  ;  Загрузить в BX число полученное с клавиатуры.
  add  ax, bx            ;  Сложить с AX
  mov  xResult, ax   ;  Сохранить результат.
  loop @

  mov ax, xResult   ; Сохранение результата в AX.
  ret
ENDP

Следующая процедура печатает число(без знака)  из регистра AX на консоль.
(c) Барри Брэй
OUTPUT PROC

   push cx
   push bx
   push dx
 
   mov cx,0
   mov bx, 10

   DISPX1:
   mov dx, 0
   div bx
   push dx
   inc cx
   or ax,ax
   jnz DISPX1
 
 
   DISPX2:
   pop dx
   mov ah, 6
   add dl, 30h
   int 21h
   loop DISPX2
 
   pop dx
   pop bx
   pop cx
   RET
ENDP     

четверг, 18 августа 2016 г.

Linux & Qt & ldd Копирование библиотек.

 Linux & Qt & ldd Копирование библиотек.

         Чтобы перенести приложение в Linux особенно если это Qt нужно скопировать все библиотеки которые требует приложение. О том какие именно библиотеки требует ваше приложение(какие использует) в Linux можно узнать выполнив в терминале:
ldd <you_programm>

Если библиотек не так много, то можно скопировать их в папку с приложением. Но что делать если библиотек очень много? Я для этих целей написал скрипт на perl.

Для того чтобы автоматизировать процесс, нужно загрузить perl; По умолчанию в debian > 6.0 идет perl в комплекте. Если этого нет то его следует поставить.

apt-get install perl

Уже поставлен?...

Далее для скрипта требуется библиотека, в терминале набираем:

cpan File::Copy

Создаем файл называем его script.pl. Открываем. 

use strict;
use warnings;
use File::Copy;

#Тут путь до вашего бинарника
my $filename = "/home/<user>/myapp";

#Тут путь до папки куда копировать библиотеки.
my $outdir   = "/home/<user>/Out/";

chomp(my @libraries = `/usr/bin/ldd -r -v $filename`);
       
foreach my $key (@libraries)
{
    next if not $key;
    my $first = index $key, "/";
    my $second = index $key, "(";
    my $newkey = substr $key, $first, ($second - $first - 1);
    copy($newkey, $outdir);  
    print $newkey, "\n";
    
    print $key, "\n";
}

copy($filename, $outdir);

Замените переменные $filename и $outdir на ваши.

Далее в терминале необходимо запустить скрипт, выполняем.
perl script.pl

p.s # - означает комментарий.