Scripting FAQ

Q: Why do you have 2 scripting languages embedded ? I want single  JavaScript( JS, Java, Pascal, lua, anything…)

A: First of all, LUA is the best language to use as embedded with C++. It’s easy to use, easy to learn, easy to connect to C++. But it’s hard to make UI having lua only. In about 2011 Nokia released QML which is absolutly perfect to make UI. However it is still near beta in 2011.  And we had already lua-based API. So – we just connected both. Use QML for UI and left logic to LUA (in origin for C++, which serves as proxy between LUA and QML in SmartSniffer project here).

Furthemore, QML engine is imlemented as extern library (DLL on Windows) according to LGPL. So you will have it always fresh and with more abilities regardless from us. Just replace DLL by newer and you can do more. We will try to keep it current.

Generic FAQ

Q. What can program do?

A. Smart Sniffer is placed between any software and hardware. So it can do record of conversation between any program and hardware or can make false responds from HW to SW even. It can NOT  ”talk” directly to hardware or “listen” it. However, if you need to do Input/Output into device just use SmartViewer and new scripting engine.

Q.What for this program can be used?

A.This program can be used for:

  • Developing or implementing Serial (COM, USB) & Parallel Protocols
  • Reverse-engineering the Serial & Parallel Protocols including proprietary protocols like Qulcomm and Sierra (it’s legal until you’ll use results for others)
  • Developing Serial and Parallel Device Drivers
  • Developing Hardware with RS232 or USB  interfaces
  • Testing Software
  • Testing Hardware
  • “Black-box” researching.
  • Develop stand-alone solutions based on script engine (subscribers only, coming soon).

Q. There is a lot of such programs on market, why to use Smart Sniffer?

  • Because it’s free-to-use
  • Because it’s just works – you can even copy stand alone exe to other machine and it will go. It works inside remote desktops, virtual machines etc.
  • New SmartViewer 5 can parse recorded data according to your rules defined by LUA script.
  • Embedded script machine is so powerfull – you can even play a game inside!
  • It can be hidden from detection by protection in Stealth Mode. It’s random. If detection can get sniffer, let us know. It’s breaking the license. We will sue them or fix sniffer to be more hidden.

Q. Is it free?

A. Yep. Starting from version 5 it is free-to-use.

Q. What are limits?

A. No limits any more. If you got one old – please let us know and we will fix it. I mean it – have a bug? let us know! )

Q. What is “Stealth Mode”?

A. In this mode program will change randomly all internal specific values. So Sniffer cannot be detected by other software. The intensity of Stealth is picked up automatically by Sniffer depending on limitations of your current system.

However, some programs may check memory for the file names, we suggest you will rename SmartSniffer.exe manually to complete Stealth. Also close help file(s) and former MPSLViewer(s) or current SmartViewer(s) because it has references to Smart Sniffer and can be detected.

Q. Have I to have Internet connection?

A. Not any more. However you may want to run Online-Updater to have fresh bug-fixes.

Q. I got log and i want to send part of it into device.

A. Use SmartViewer. You can write own script or use Terminal. Terminal is not included in standard 5.x package yet. Download it from the site.

Q. I’m not sure how to use Smart Sniffer…

A. Just remember to press F1 on keyboard when you don’t know what to do ;)

Q. What for “Insert bookmark” link?

A. While record is going you can click it and sequentially numbered mark will be inserted into log immediately. Later you will see all marks in log watching it by former MPSLViewer or current SmartViewer, so it is convenient way to mark-up what was done between recorded packets.

Marks are available starting from v 3.2.1 of SmartSniffer. Minimal MPSLViewer’s version which supports it is 2.5.1.

Q. Sniffer hungs trying to log COM-mapped IR port. How to do?

A. IR-drivers are modern WDM and cannot properly restart in request of sniffer sometimes because sniffer uses NT4-compatible driver. Try next: put IR device in “visible” zone, when icon will appear in system-tray immediately press “Start” in sniffer. As for year 2011 we have no mentions about IR at all.

Q. You didn’t answer to my email, why?

A. We answer emails during 48 hours usually. If you didn’t get response from us then check your spam-filters please. Most likely email was trashed. That is common problem nowadays. Resend your query and give us additional contact info like ICQ or other email address.

Q. Where can I get more info?

A. You can left your question/comment right here or visit our forum:

Your email:

Your question/comment:

luaScript object

luaScript object is a way to call LUA script from inside QML script. Backward call (from lua to qml) is not possible. So QML should use functions’ calls to get fresh data from script always.

Object has next methods (functions):

  • luaScript.callI – returns Integer;
  • luasScript.callS – returns String;
  • luaScript.callV – returns nothing (Void);
  • luaScript.callSL – returns Strings List;

All those methods accept LUA’s function name as 1st parameter. 2nd parameter is optional and can be: integer, string, integer list (array), string list(array).

Sample:

Button {
        id: brun
        x: 6
        y: 454
        anchors.left: parent.left
        anchors.leftMargin: 6
        anchors.top: textBG.bottom
        anchors.topMargin: 172
        onClicked: luaScript.callV("run_clicked",edit.text)
        skin: "./run.png"
    }

This sample declares some button when it’s clicked it calls lua function “run_clicked” and passes text from “text edit box” to it. Lua file should have next:

function run_clicked(what)
  local f,err = loadstring(what)
  if f == nil then
     showMsg(string.format("Error: %s",err))
  else
     local s,m = pcall(f)
     if not s then
       showMsg(string.format("Error: %s",m))
     end
  end
end

This version is not final but is minimal to solve tasks like programming I/O COM port terminal completelly using scripts.

Introduction to Additional UI

As we know SmartViewer can be extended by scripts. Further evolution of this idea gives us “additional UI”. For some tasks we want to have complex user interaction. We may want:

  • scan flash dump and find pictures – display it;
  • make port I/O terminal and use it;
  • build diagram of bytes distribution;
  • anything else.

As developer I could not imagine all tasks program would be used for, so I decided instead “giving fish” to make tool for “fishing”.

Now anybody can add extra features to the sniffer using QML language developed by Nokia which is based on JScript. So in fact we have 2 script languages embedded – QML for doing UI and interaction and LUA to access ports, files, records. However, teaching of those languages is not goal of this site you should check other resources.

UI-based extensions can be done in 3 simple steps:

  1. Write UI using QML, access lua using object “luaScript“.
  2. Write LUA script to access loaded data or ports on system.
  3. Declare QML into XML descriptor.

Be careful with QML file names. According to Nokia it can be case sensitive and be used for implicit purposes. For example, new “item” like “Button” should use “Button.qml” file name.

User Interaction Functions

Engine allows to do simple common user interaction without doing complex UI.

Read the full post »

Data Block’s Functions

Functions to work with Block List.

Read the full post »

Common Functions

Common API functions.


Read the full post »

API Reference по русски

Внимание! Данная версия может быть устаревшей.

Дополнения

Smart Sniffer Viewer
(далее SSV) использует lua скрипты для реализации функций
интерфейса, фильтрации входного файла, расширения круга решаемых задач.

 

Каждый скрипт
запускается в отдельной виртуальной машине.  Скрипты загружаются в
память при старте программы и по команде перезагрузки расширений. Все
глобальные значение постоянно хранятся в памяти.
При вызове
команды “обновить расширения” все виртуальные машины принудительно
уничтожаются.
При возникновении ошибки в скрипте выводится сообщение, записывается в
лог-файл и виртуальная машина уничтожается.Скрипты могут выполнять любые преобразования над записанными данными и
(или) изменять отображение данных конечному пользователю.Разные дополнения могут общаться между собой только путем модификации
записанных данных ( что отобразится и пользователю), или через внешние
файлы.

Любое дополнение состоит из следующих файлов:

  1. 1 или более текстовых файлов, содержащие код на языке lua.
  2. ровно 1 файл-описатель в формате xml.
  3. 1 или более графических файлов форматов png/ico, содержащих значки скрипта.
  4. 0 или 1 файл интерфейса пользователя на языке qml.
XML файл описатель должен иметь
расширение “.xml” и находится в папке ./extensions/ или любой вложенной
в нее папке. Остальные файлы ищутся относительно файла-описателя и
могут находиться где угодно.

Структура файла-описателя

Файл представляет собой текстовый xml файл, со следующими тэгами:

<menu> - тэг контейнер, все остальные вложены в него, содержит следующие тэги:

<section>
- не обязательный тэг, название секции, куда должен быть
помещен скрипт визуально. Распознаются предопределенные секции
меню: calc, find, edit,export,navi. Если название не совпадает с предопределенным или отсутствует, то скрипт будет помещен в секцию Others.
<script> – обязательный
тэг, содержит название (и, возможно, путь к ) главного файла скрипта,
относительно месторасположения файла-описателя. Абсолютные пути здесь
не допустимы. Если указанный файл не существует, то скрипт не
отображается в списке пользователю. Тэг может содержать атрибут keepit (в настоящее время устарел и игнорируется).<form> – не обязательный тэг, путь к файлу qml.  При его наличии по вызову скрипта будет открыватся доп. вкладка интерфейса.<button> – содержит
описание, которое будет показанно пользователю в меню. Таких тэгов
может быть несколько, каждый будет отображен отдельной строкой меню.
Обязательно наличие хотя бы одного тэга <button>. Содержит
следующие тэги:

<name> – Имя, которое выводится пользователю. Наличие обязательно.

<shortcut> – не
обязательный тэг, задает комбинацию клавиш, для запуска этого скрипта.
Использовать с осторожностью, т.к. нет гарантии, что другой скрипт не
будет использовать эту же комбинацию. Подробнее здесь.

<icon> – не обязательный тэг, позволяет задать имя файла значка в меню пользователя, относительно месторасположения файла-описателя.

<callparam> – не
обязательный тэг, его значение передается скрипту в глоб. переменной
CallParam. Нужен для того, что бы скрипт мог различать вызовы под
разными именами.

<hint> – не обязательный тэг, содержит краткое описание, показываемое пользователю.

Пример:

<menu>

<section>find</section>

<script>find.lua</script>

 

<button>

<name>Text Search (case insensitive)</name>

<shortcut>ctrl+F</shortcut>

<icon>afind.png</icon>

<callparam>t</callparam>

</button>

 

<button>

<name>Binary Search</name>

<shortcut>ctrl+alt+F</shortcut>

<icon>hfind.png</icon>

<callparam>b</callparam>

</button>

</menu>

 

 

Организация записанных данных.

Файл данных, записанный
программой Smart Sniffer загружается в память SSV и представляет собой
нумерованный набор блоков. Нумерация блоков начинается с 1. Блоки
отображаются пользователю по порядку номеров. Каждый блок содержит
заголовочную информацию и собственно данные. Допустимы блоки, которые
не содержат данных, например, метка пользователя.
Скрипт может добавлять и удалять блоки в/из списка, получать заголовок
и данные по номеру блока, перезаписывать заголовок и данные по номеру
блока. Все внесенные изменения не сохраняются в исходный файл и
существуют только в памяти программы.

Структура заголовка

Заголовок блока – по сути таблица с предопределенными полями:

  • Type – целое число, тип блока. Может быть сравнен с
    глобальными значениями.
  • TimeAbs – число, абсолютное время
    записи блока,
    относительное начала записи может быть вычислено с использованием
    функции getTimeBase(), например: hdr.TimeAbs – getTimeBase(). Время
    дано в наносекундах, для получения миллисекунд, необходимо делить на
    1000.
  • Port – целое число, имеет смысл для LPT записей и
    показывает порт ввода-вывода.
  • Extra – строка, по умолчанию nil. Скрипт может добавить
    любое значение, оно будет показано в информационной колонке (крайне
    левая) в добавок ко встроенному отображению.
  • Hex – строка, по умолчанию nil. Любое значение, кроме
    пустой строки отменяет встроенное отображение и выводит эту строку в
    среднем столбце пользователю.
  • Ascii – строка, по умолчанию nil. Любое значение, кроме
    пустой строки
    отменяет встроенное отображение и выводит эту строку в правом
    столбце
    пользователю.

Пример использования заголовка:

 
local hdr,data = getBlock(i);


if hdr.Type == D_HEADER then

hdr.Extra = “\”Qualcomm Generic\” applied\n”

setBlock(i,hdr);


end

Типы заголовка

Глобально определены константы-типы заголовка:

  • D_CHAININP – блок содержит данные передаваемые от устройства к компьютеру, отображается черным цветом.
  • D_USBCONTROLIN – блок содержит данные передаваемые от
    устройства к компьютеру по управляющему каналу USB, отображается черным
    цветом.
  • D_USBREAD – блок содержит данные передаваемые от устройства к
    компьютеру через чтение устройства, как файла (ReadFile API),
    отображается черным цветом.
  • D_CHAINOUT – блок содержит данные передаваемые от компьютера к устройству, отображается синим цветом.
  • D_USBCONTROLOUT – блок содержит данные передаваемые от
    компьютера к устройству по управляющему каналу USB, отображается синим
    цветом.
  • D_USBWRITE – блок содержит данные передаваемые от компьютера к устройству  через запись
    устройства, как файла (WriteFile API),, отображается синим цветом.
  • D_USBIOCTL – данные, переданные устройству через DeviceIOControl. Отображается черным цветом.
  • D_EMULATEDINP – эмулированные снифером данные, они переданы
    целевой программе, вместо тех, что поступили от устройства.
    Отображаются сиреневым цветом.
  • D_MARK - метка пользователя, отображается только в инф. части. Не имеет данных.
  • D_HEADER – всегда единственный блок, содержит заголовочную информацию, как то устройство его записавшее и версия файла.
  • D_LAST – не существующий блок. Скрипты могут использовать типы
    D_LAST+n для передачи данных. Блоки типа >=D_LAST отображаются
    пустыми строками всегда или не отображаются вообще, если они завершают
    список блоков.
  • D_PORTSETTINGS – Содержит данные для Windows DCB структуры COM порта. Отображается в зеленом цвете.

Любые блоки со значением поля Type, не указаным здесь, не должны модифицироватся скриптом.

 

Модульность

Скрипт может включать в себя любые другие файлы/скрипты командой lua dofile(file_name). В случае использования относительного пути в имени файла, оно должно быть относительно положения главного модуля программы.

Глобальные функции и значения

Каждый
скрипт получает все стандартные библиотеки lua 5.1. Таким образом,
относитесь ответственно к запуску скриптов из не надежного источника.
Они могут модифицировать любой файл в системе! Автор не несет
ответственности за любые повреждения или потери при использовании Smart Sniffer Viewer и любых скриптов с ним.
Если вы не согласны с этим заявлением, удалите программу с вашего компьютера.
В данный момент скрипты должны быть сохранены в однобайтной кодировке,
что накладывает ограничение на язык строк и их переводимость.
Рекомендуется использовать строки латиницей. Поддержка многобайтных
строк и переводимость скриптов пока не планируется.

Глобальные константы

Определены следующие глобальные константы, которые могут использовать скрипты:

  • CallParam – параметр – строка, заданный в XML файле в тэге <callparam>.
  • Selected – таблица
    координат ячеек, которые выбраны пользователем. Может быть пустой. Каждый элемент содержит
    два поля Row и Col. Нумерации полей и элементов начинаются с 1. Row
    совпадает с номером блока. Пример:

for k,v in pairs(Selected) do

   logOut(string.format(“%u,%u”,v.Col,v.Row));

end

Глобальные функции

Функции общего назначения

apiCheck(version)

Функция принимает целое число-номер требуемой версии API. Если текущая
версия меньше указанной в параметре, то скрипт прерывается с ошибкой.

Рекомендуется выполнять проверку в 1й строке скрипта, текущая версия 1 не требует такой проверки.

Функция ничего не возвращает.

yield()

Ничего не принимает и ничего не возвращает. Вызывает обработку
сообщение ОС. Следует использовать при длительных циклах для
предотвращения сообщения “процесс не отвечает”.

version = getApiVersion()

Функция без параметров, возвращает численное значение версии API. В
последующих версиях набор функций может быть изменен. Расширение должно
проверять версию перед использованием доп. функций.

copyText(string)

Копирует строку в глобальный буфер обмена, ничего не возвращает.

Функции работы с блоками данных

count = getBlockCount()

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

getTimeBase()

Возвращает абсолютное значение времени начала записи в наносекундах. Если файл данных не загружен, результат не определен.

header,data = getBlock(number)

функция возвращает две таблицы, заголовок
и данные по номеру в списке (первый блок имеет номер 1). Данные
представляют собой таблицу чисел, занумерованых начиная с 1. Каждый
элемент это 1 байт записи. Для некоторых типов заголовков таблица
данных может быть пуста.

 

setBlock(number,header,data)

функция принимает 3 параметра, номер блока (блок должен существовать), таблицу-заголовок и таблицу-данные. Данные представляют собой таблицу чисел, занумерованых начиная с 1. Каждый элемент это 1 байт записи.

Текущие значения блока будут заменены на указанные. Третий параметр
“data” не является обязательным, при его отсутствии будет сохранено
текущее значение. Отсутствие 3го параметра может значительно ускорить
обработку больших файлов.

Функция ничего не возвращает.

 

insBlock(number)

функция добавляет в список пустой блок с указанным номером (начиная с
1), при этом существующий блок с таким же номером получит номер+1 и так
далее до конца списка. Возможно добавить блок в конец:
insBlock(getBlockCount()+1).

Функция ничего не возвращает.

 

delBlock(number)

удаляет блок из списка по номеру (начиная с 1). Все последующие блоки
сдвигаются, чтобы занять пустое место в нумерации: блок “номер+1″
становится блоком “номер”.

Функция ничего не возвращает.

 

data changeDataSize(number,newsize)

у блока “номер” (начиная с 1)  изменяет размер данных на
“новыйразмер”, если новый размер меньше старого – байты данных
отбрасываются, если больше - добавляются нулевые байты.

Функция возвращает таблицу данных нового размера. Данные представляют
собой таблицу чисел, занумерованых начиная с 1. Каждый элемент это 1
байт записи.

Функция работает эффективнее аналогичных преобразований таблиц в lua.

getRecordPort()

Функция без параметров, возвращает целое число, тип записанного устройства. Может принимать значения:

  1. BT_COM – записано на COM порте.
  2. BT_USB – записано на USB порте.
  3. BT_LPT – записано на LPT порте.
  4. BT_LPTIO – записано на LPT порте через регистры.

Функции взаимодействия с пользователем

logOut(string)

выводит строку в файл лога (по умолчанию luaLogFile.txt).

Функция ничего не возвращает.

 

ok, result = userInput(mode,caption,label,….)

функция работает в нескольких режимах и принимает переменное число
параметров. Предназначенна для вывода диалога-запроса пользователю.

Первый параметр – число, номер режима, для указания используются
предопределенные константы. Второй параметр – строка-заголовок окна,
третий параметр – текст в окне.

Режимы (1 параметр):

  • GETINT – показывает
    диалог-запрос числа. Может иметь дополнительно следующие параметры(4й,
    5й, 6й,7й): значение по умолчанию, минимальное значение, максимальное
    значение, шаг изменения. Возвращает число, введенное пользователем.
  • GETSTRING – показывает
    диалог-запрос строки. Может иметь дополнительно 4й параметр со строкой
    по умолчанию. Возвращает строку, введенную пользователем.
  • GETLIST – показывает диалог-запрос из заданного списка. 4й параметр обязательно
    должен быть таблицей строк вариантов выбора. 5й не обязательный -
    число, указывающее выбраное значение в списке по умолчанию (нумерация с
    1), 6й параметр – логическое значение, показывающее может ли
    пользователь ввести свою строку, не указанную в списке. Возвращает
    строку(текст, а не ее номер), которая выбрана в списке или введена
    пользователем.

Функция возвращает два значения. Первое логическое, true, если
пользователь нажал “ОК”, false, если нажал “Отмена”. Второе значение
зависит от режима вызова функции (см. выше).

Пример:

ok,s = userInput(GETLIST,”Test”,”List:”,{“COM1″,”COM2″,”COM3″},2,false)

if (ok) then

logOut(string.format(“%s”,s))

else

logOut(“canceled”)

end

setSelection(table)

Выделяет ячейки, может быть заданно несколько ячеек в виде пар
координат (в функцию передается таблица таблиц, каждый элемент таблицы
есть таблица, содержащая Row & Col).  Пример выделения двух
ячеей в одной строке:

setSelection({{["Row"]=i,["Col"]=3},

{["Row"]=i,["Col"]=2}});

Если блок не был еще нарисован, есть смысл использовать цепочку
“выбор-прокрутка-выбор”, т.к. иногда не происходит визуальное
отображение до 1го действия пользователя, например:

      setSelection({{["Row"]=i,["Col"]=3}});

      scrollToRow(i)

      setSelection({{["Row"]=i,["Col"]=3}});

 

Функция ничего не возвращает.

scrollToRow(number)

функция прокручивает область просмотра так, что указанная строка
“номер” будет находится вверху окна. Нумерация строк начинается с 1.
Следует помнить, что каждому блоку соответствует 1 строка отображения.

Функция ничего не возвращает.

 

showWait(boolean)

функция показывает, если параметр равен true или прячет в ином случае
окно-предупреждение, блокирующее активность пользователя. Рекомендуется
использовать для длительных операций. При возникновении ошибки и прерывании скрипта, окно будет спрятано автоматически.

Функция ничего не возвращает.

showMsg(string)

Выводит сообщение с кнопкой ОК.

Функция ничего не возвращает.

Функции работы с COM-портами

listCOMPorts()

Функция возвращает 2 таблицы, где индексы (ключи) в первой таблице -
системные имена порта, вроде “COM1″, а значения в таблице -
дружественные описания, показываемые пользователю. Во второй
таблице ключи и значения поменяны местами, относительно первой.
Пример:

t1,t2 = listCOMPorts()

ok, s = userInput(GETLIST,”TEST”,”Ports”,t1,1,false);

showMsg(t2[s])

 

 

 

 

 

 

Global Variables

Each time script executed it has access to the next global values, which can be changed between launches:

  • CallParam – holds value, defined into XML descriptor file. It’s a way to define different features using same script.  Changing of this value will affect nothing, furthemore will be lost on next script’s call.
  • Selected – it’s a table of tables. Holds selected by user cells into view. Can be empty if nothing selected. Numbering starts from 1 and usually equals to block number (but not guranteed because of other scripts, which may add “invisible” blocks), each element has 2 fields “Row” and “Col”.  Changing of those values will affect nothing, furthemore will be lost on next script’s call. Consider it as read-only. Example:

for k,v in pairs(Selected) do

   logOut(string.format(“%u,%u”,v.Col,v.Row));

end

  • Other global constants to use with functions, which are described into corresponding sections of this guide.

Recorded Data Structure

SmartViewer loads recorded data by SmartSniffer and builds a list in memory. This allows to be independent from the file format (which is many formats already). However since data are fragmented during recording, it will be fragmented in the list too. So it’s up-to scripts to validate data. Script can merge elements, remove elements, add new elements to the list. Such a way included Generic Qualcomm Filter works. Former MPSLViewer had options “EOT” and “Optimization” which were particular solutions.

Data Blocks are sequentally numbered starting from 1. Each block contains header and data. It is possibly to have blocks without data. Script can access blocks by its number and modify it, other script will get modified block (list) – so Data List is shared between all scripts.  However changes will not be stored into original file. User can reload original state always.

Header

From script’s point of view header is table with fields:

  • Type – integer, should be compared to global predefined types.
  • TimeAbs – absolute time of when block was recorded measured in nanoseconds. You can use getTimeBase() function to calculate time related to log beginning.
  • Port – integer, has sence only for LPT records. It is I/O port used.
  • Extra – string, default nil. If script sets this string it will be displayed in addition to info in leftmost column.
  • Hex – string, default nil. If script sets this string it will replace default view of the middle column.
  • Ascii – string, default nil. If script sets this string it will replace default view of the rightmost column.

Sample:

local hdr,data = getBlock(i);
if hdr.Type == D_HEADER then
hdr.Extra = “\”Qualcomm Generic\” applied\n”
setBlock(i,hdr);
end

The “Type” field can be one of the following values:

  • D_CHAININP – block has data transmitted from device to PC, black color.
  • D_USBCONTROLIN – block has data from device to PC using USB Control chanel, black color.
  • D_USBREAD – block has data from device to PC using ReadFile API call, black color.
  • D_CHAINOUT – block has data transmitted from  PC to device, blue color.
  • D_USBCONTROLOUT – block has data transmitted from  PC to device using USB Control chanel, blue color.
  • D_USBWRITE – block has data transmitted from  PC to device using WriteFile API call, blue color.
  • D_USBIOCTL – block has data sent to driver using  DeviceIOControl, black color.
  • D_EMULATEDINP – emulated input which was sent to application by sniffer instead real device data, magenta color.
  • D_MARK – user mark. Data is 4 bytes of DWORD which is sequental number.
  • D_HEADER – always only one present, data contains device information, file version, etc.
  • D_LAST – block which does not exists. Scripts may use D_LAST+n for own use. Those blocks have no default view.
  • D_PORTSETTINGS – block has DCB structure data as it dumped from Windows DCB structure, green color. For the records made on NT-based systems (w2k,XP,Vista,W7)  it’s built from many different requests by viewer because DCB is not used any more at the kernel level, so it may be incomplete DCB.

Scripts must skip unchanged block types which are not mentioned here. Possibly sniffer will use more types later.

Data

Data is always table of numbers (bytes – only lowest byte used) sequentally numbered starting from 1. Meaning of those numbers depends on header’s field “Type“.

 

  • Login